【发布时间】:2016-03-06 11:59:00
【问题描述】:
我在 PHP 中遇到了一些非常奇怪的行为。我不知道这是否发生在所有其他 oop 语言中,所以这是一个额外的问题 - 是吗?好的,据我所知:
- 当您从基类继承某些内容时,您基本上是复制 - 将受保护的和公共的方法粘贴到子类中,而不是私有的。
- 您无法访问类私有成员。
- 调用具体实例的方法时,您应该在实例上下文中调用该方法,就好像它是他自己的类的方法一样,其中 $this 指向调用该方法的对象(类的实例) .
就我在纯 PHP 中进行的测试而言,这不是真的,我完全被迷住了。谁能解释一下这种奇怪的(对我来说)行为?
这里是测试代码:
<?php
class A {
private function foo() {
echo "Here are the private stuff that only A class knows about..." . '</br>';
echo "The class name of this function is" . __CLASS__ . '</br>';
}
public function test() {
$this->foo();
}
}
class B extends A {
}
class C extends A {
private function foo() {
}
}
$a = new A();
$a->test();
$b = new B();
$b->test();
$c = new C();
$c->test();
$reflectionA = new ReflectionClass($a);
$reflectionB = new ReflectionClass($b);
$reflectionC = new ReflectionClass($c);
var_dump($reflectionA->getMethods());
var_dump($reflectionB->getMethods());
var_dump($reflectionC->getMethods());
var_dump($reflectionB->hasMethod('foo'));
【问题讨论】:
-
那么上面的代码有什么问题?
-
例如,如果您将方法 test 复制粘贴到 B 类中,您将获得完全不同的行为。好的,我知道根据定义继承是紧密耦合,但是我没想到当您调用 B 类从 A 类继承的方法时,您调用该方法就好像它是 A 类的方法而不是 B 类的方法一样。在 C 中,我们有一个 C 的实例,我们有一个带有 $this 的函数测试,它指向 A 类 foo 而不是 C 类 foo。这对我来说相当令人不安。我需要一个解释。
-
您偶然发现了“后期状态绑定”或“早期状态绑定”的问题。你可以阅读它以及它是如何在 php 中处理或控制的。
-
(顺便说一句:这就是为什么你使用“复制和粘贴”图片来解释 OOP 原则的原因之一。事情完全不同。)
-
嗯,这应该是某种闭包吗?我的意思很明显,函数 foo 记得它是在哪里创建的?
标签: php oop inheritance