Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这些代码行能够成功执行 我非常熟悉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 - Fatal编程技术网

为什么这些代码行能够成功执行 我非常熟悉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();

为什么这些代码行能够成功执行 我非常熟悉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:抽象公共函数() 最后,但并非最

这是一个不太好的编码的例子。首先,我建议激活严格的错误报告(E|u ALL | E|u strict | E|u NOTICE)

  • 如果以前未声明的类/对象属性被赋值,那么它将被创建为对象的公共属性。但是,如果有严格的错误报告,您将收到一个E_通知

  • 虽然
    \uuu
    属于
    B
    类,但当B被实例化时,可以从A调用它。该方法未声明为
    公共
    /
    受保护
    /
    私有
    ,因此默认情况下它是
    公共
    ,因此家长/孩子以及外部都可以访问

  • 当然,这通常是糟糕的编码风格,至少A需要在子类中使用以下行实现
    \uuu
    抽象公共函数()

  • 最后,但并非最不重要的一点是,函数名
    \uuu
    违反了PHP惯例,因为以两个下划线开头的方法是保留的


  • 我将把PHP描述成一种在事物不清楚时倾向于做出假设的语言,而C++和java语言则是强迫你显式地写出所有的东西,否则它们就会抛出错误。p> 问题#1在PHP中,您不需要显式地声明类属性,以便以后能够分配它们,正如您所发现的那样。显然,如果您立即尝试

    echo$this->var在一个类中,如果不指定它,它将是未定义的

    问题#2-这个问题有点奇怪,但基本上,如果您从子类创建一个超类,并在子类中定义的方法内调用一个方法,则会调用超类版本。因此,即使A中没有定义
    ,但是B中定义了它,所以如果您创建一个A对象,并调用
    echoVar()
    您将得到一条关于方法的消息_uz()未定义,您仍然可以调用
    echoVar(),如
    \uuuuuuux()

    问题#3与#2类似,即使在子类中使用,也将使用变量的超类版本

    然而,我个人会尽量不使用这种编码风格。我相信您已经意识到,让类依赖于它的超类不是一个好主意。最好明确声明这些内容


    至于OOP,您发布的代码主要是使用对象,而不是自由浮动函数或代码行。

    PHP行为,如果您为不存在的属性赋值,就是创建一个新的公共属性方法
    \uuuu()可供包含
    \uu()的实例化类的所有父类访问
    。。。。除非父级有自己的
    \uuux0()
    方法。。。。基本上,子类可以访问其父类和子类中的所有公共或受保护的内容—请参阅,对于早期版本的PHP,这可能是正确的,或者如果错误报告配置为向后兼容。在现代PHP开发中,上面的代码经不起代码审查,每一个像样的IDE都会发疯。@Ixg正如我在回答中所说的,我永远不会使用它。