为什么这些代码行能够成功执行 我非常熟悉C++和java中的面向对象编程,而且在PHP中我对它很熟悉,毕竟PHP支持OOP。我正在重构实习期间给我的一些代码,我遇到了以下PHP编码风格 <?php class A { public function echoVar(){ $this->__(); echo $this->var; } } class B extends A{ function __(){ $this->var = 1; } } $v = new B(); $v->echoVar();
这是一个不太好的编码的例子。首先,我建议激活严格的错误报告(E|u ALL | E|u strict | E|u NOTICE)为什么这些代码行能够成功执行 我非常熟悉C++和java中的面向对象编程,而且在PHP中我对它很熟悉,毕竟PHP支持OOP。我正在重构实习期间给我的一些代码,我遇到了以下PHP编码风格 <?php class A { public function echoVar(){ $this->__(); echo $this->var; } } class B extends A{ function __(){ $this->var = 1; } } $v = new B(); $v->echoVar();,php,oop,Php,Oop,这是一个不太好的编码的例子。首先,我建议激活严格的错误报告(E|u ALL | E|u strict | E|u NOTICE) 如果以前未声明的类/对象属性被赋值,那么它将被创建为对象的公共属性。但是,如果有严格的错误报告,您将收到一个E_通知 虽然\uuu属于B类,但当B被实例化时,可以从A调用它。该方法未声明为公共/受保护/私有,因此默认情况下它是公共,因此家长/孩子以及外部都可以访问 当然,这通常是糟糕的编码风格,至少A需要在子类中使用以下行实现\uuu:抽象公共函数() 最后,但并非最
\uuu
属于B
类,但当B被实例化时,可以从A调用它。该方法未声明为公共
/受保护
/私有
,因此默认情况下它是公共
,因此家长/孩子以及外部都可以访问\uuu
:抽象公共函数()代码>
\uuu
违反了PHP惯例,因为以两个下划线开头的方法是保留的我将把PHP描述成一种在事物不清楚时倾向于做出假设的语言,而C++和java语言则是强迫你显式地写出所有的东西,否则它们就会抛出错误。p> 问题#1在PHP中,您不需要显式地声明类属性,以便以后能够分配它们,正如您所发现的那样。显然,如果您立即尝试
echo$this->var代码>在一个类中,如果不指定它,它将是未定义的
问题#2-这个问题有点奇怪,但基本上,如果您从子类创建一个超类,并在子类中定义的方法内调用一个方法,则会调用超类版本。因此,即使A中没有定义。
,但是B中定义了它,所以如果您创建一个A对象,并调用echoVar()
您将得到一条关于方法的消息_uz()未定义,您仍然可以调用echoVar()类型为B的对象中的代码>,如\uuuuuuux()这里定义了代码>
问题#3与#2类似,即使在子类中使用,也将使用变量的超类版本
然而,我个人会尽量不使用这种编码风格。我相信您已经意识到,让类依赖于它的超类不是一个好主意。最好明确声明这些内容
至于OOP,您发布的代码主要是使用对象,而不是自由浮动函数或代码行。PHP行为,如果您为不存在的属性赋值,就是创建一个新的公共属性方法\uuuu()可供包含\uu()的实例化类的所有父类访问
。。。。除非父级有自己的\uuux0()
方法。。。。基本上,子类可以访问其父类和子类中的所有公共或受保护的内容—请参阅,对于早期版本的PHP,这可能是正确的,或者如果错误报告配置为向后兼容。在现代PHP开发中,上面的代码经不起代码审查,每一个像样的IDE都会发疯。@Ixg正如我在回答中所说的,我永远不会使用它。