代码之家  ›  专栏  ›  技术社区  ›  antpaw

父级::在实例化类中

php
  •  3
  • antpaw  · 技术社区  · 14 年前

    我想知道为什么没有 $parent->function(); PHP中的语法,但是我们可以使用 parent::function(); 它看起来像是在静态类中使用的。我是否缺少一些PHP OOP基础知识?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Pascal MARTIN    14 年前

    我承认这看起来很奇怪——而且你没有错过手册中的任何内容^^

    但是:

    • 通常,当子类重新定义一个已经在父类中定义的方法时,您希望子类的方法完全重写父类的方法
      • 除了 __construct ,我承认——这可能就是为什么手册中明确地说你必须打电话给家长的原因。 β-构造 自己动手。
    • 一般来说,当使用非静态方法时,只需使用 $this 在子类或父类的同一实例中调用方法;不需要知道方法的实际位置。
    • 使用 parent:: 工作正常,即使它看起来像静态调用


    下面是一个显示代码的示例 起源:: 工作正常:

    class Father {
        public function method() {
            var_dump($this->a);
        }
    }
    
    class Son extends Father {
        protected $a;
        public function method() {
            $this->a = 10;
            parent::method();
        }
    }
    
    $obj = new Son();
    $obj->method();
    


    您将得到这个输出:

    $ /usr/local/php-5.3/bin/php temp.php
    int(10)
    

    这表明父类中的方法可以访问 $此 以及在子类中定义的属性。

        2
  •  2
  •   Pekka    14 年前

    好, parent 实际上引用了静态父类-没有理由假定存在已实例化的 $parent 只因为存在一个 $child 即使有, 小孩 无法访问 美元母公司 .

    最后,一个实例 class dog extends animal 糟糕的解释不起作用!:)

        3
  •  1
  •   Tyler Carter    14 年前

    因为使用 $parent 假设您已经实际实例化了父类。

    如果语法建议有效,则意味着每次实例化一个对象时,都要实例化两个或多个对象。

    在PHP中,每个变量必须包含字符串、整数(或其他数字格式)、数组、对象或资源。 $this 包含一个对象,它恰好是您当前所在的对象。

    为了创造 美元母公司 ,你必须把一个物体放进去 美元母公司 .父类在技术上不是实例化的,因此不能分配给变量。

    顺便说一句 parent::function(); 可以访问所有 $此 .

    因此,这项工作

    class Test
    {
        public function test()
        {
            echo $this->testing_var;
        }
    }
    
    class OtherTest
    {
        public function run()
        {
            $this->testing_var = "hi";
            Test::test(); // echos hi
        }
    }
    

    如果它在类之外使用,这将出错,并告诉您它应该声明为静态的。

    Test::test();