PHP属性不存在但使用时不会抛出任何错误

时间:2018-06-06 14:34:51

标签: php oop

所以我遇到了这样的代码,它使用了一个名为testObj的Bar类属性,虽然它没有定义,所以我预计这是错误的,但我测试了它自己的没有错误:

    <?php
class Foo{
    public function __construct()
    {
        echo 'Echo From Foo';
    }
}
class Bar{
    public function __construct(Foo $foo)
    {
        $this->testObj = $foo;
    }
}

$bar = new Bar(new Foo);

为什么会这样?这是否与PHP的动态/松散类型&#34;或其他什么有关?

2 个答案:

答案 0 :(得分:2)

属性可以动态定义,其可见性默认为公开,如下例所示:

class X {
  public function test()
  {
    $this->y = 'test';
  }
}

$x = new X();

$x->test();

echo $x->y; // test

你也可以不在课堂上这样做,所以如果我想添加另一个属性,我可以这样做:

class X {
  public function test()
  {
    $this->y = 'test';
  }
}

$x = new X();

$x->test();

echo $x->y; // test

$x->z = 'blah';

echo $x->z; // blah

请记住,当实例化一个类时,它只是一个可以像任何其他对象一样被操纵的对象。

注意:如果我不在上面的代码中调用test(),则会导致错误(未定义的属性),因为该变量尚未定义,除非在test()功能。

直播示例

Repl

答案 1 :(得分:1)

这是完全正常的,您可以动态地将每个项目分配给PHP类而不会出错。事件,如果您应该正确声明它以跟踪您的对象结构。 如果你想让它抛出一个错误,你可以使用__get魔术函数和ReflectionClass来确定属性的设置,即使我没有看到这样做的任何优点,你也无法设置。