2015-04-03 72 views
8

为什么此代码回显“BD”?得到这个后,我感到很惊讶。我正在学习OOP概念,并且是高级php的新手段。为什么构造函数被调用,如果类有一个方法(函数)与他的名字?

class A { 
    public function a(){ 
     echo "A"; 
    } 
} 
class B extends A { 
    public function b(){ 
     echo "B"; 
    } 
} 
class C extends B { 
    public function a(){ 
     echo "C"; 
    } 
} 
class D extends C { 
    public function a(){ 
     echo "D"; 
    } 
} 

$d = new D(); 
$d->a(); 
+1

我不会依赖它,它将在php7中被弃用:弃用:与他们的类名称相同的方法在未来的PHP版本中不会是构造函数; – Daan 2015-04-03 08:55:37

+0

class classB extends A {public function b(){echo“B”; }}在将类B更改为喜欢高级代码之后。那么它为什么回应'AD'? – 2015-04-03 09:02:39

+0

好吧,我有你的观点。现在我明白了。谢谢大家。 – 2015-04-03 09:19:06

回答

6

当你调用$d = new D();B调用构造函数(因为从C继承DB继承C),当你调用$d->a();方法您Da()被称为和打印D那么你有作为输出BD

为了向后兼容,如果PHP 5找不到给定类的__construct()函数,并且类没有从父类继承,它将搜索旧式构造函数,名称为类。实际上,这意味着唯一会遇到兼容性问题的情况是该类有一个名为__construct()的方法,该方法用于不同的语义。

在你的情况,你的A类和您的B类有一个构造函数

读模式:

http://php.net/manual/en/language.oop5.decon.php

+0

但我还没有宣布对B类的构造函数 – 2015-04-03 08:57:35

+0

@MihirVadalia是你有一个构造函数public function B() – 2015-04-03 08:59:11

+0

@MihirVadalia编辑我的答案,看一看 – 2015-04-03 09:03:07

6

有一个丑陋的副作用发生。在以前的PHP版本中,类的构造函数必须与类本身具有相同的名称。 名称区分大小写。含义b是您的案例中B的构造函数。由于DBD的子项,因此不会引入自己的构造函数,因此将调用B的构造函数,以便在输出中触发B

在PHP的现代版本中,构造函数应该被称为__construct()以避免这样的问题。但是,您仍然可以使用旧的机制,但如果您的错误报告级别设置为E_STRICT,则会触发通知。

+0

class classB extends A { \t \t public function b(){ \t \t \t echo“B”; \t \t} \t} 将类B更改为喜欢高位代码后。那么它为什么回应'AD'? – 2015-04-03 09:01:30

+0

我不明白你的意思。你能详细说明吗? – hek2mgl 2015-04-03 09:03:01

+0

@ hek2mgl,他的意思是说,他将构造函数的名称从'b()'改为'B()',现在输出为'AD' – Samveen 2015-04-03 09:12:38

相关问题