关于PHP中的任意类属性

时间:2019-06-04 12:09:42

标签: php class oop

我刚刚了解到您可以设置类的任何属性(只要未明确将其声明为私有属性即可)。例如:

class Test {}
$test = new Test;
$test->randomthing = 'Hello world';
var_export($test);

可以很好地设置randomthing对象的属性$test

我正在尝试找出此行为的含义,以及是否有可能消除/禁用此行为(以最大程度地减少代码中的错误),因为按照目前的状态,我可能会输入我想要的属性而没有及时注意到

理想情况下,我希望拥有:

class User {
    protected $name;
}

然后我希望能够设置一个$user->name = '',但不能设置$user->randomthing = ''。理想情况下,第二个调用将引发异常或某些异常。

我试图通过查找“动态属性”来猜测这个约定,但这似乎是指像双美元语法这样的东西,它通过变量中的值来引用属性。

那么,您怎么称呼这种行为?我在哪里可以读到更多有关控制(或禁用)的信息?

2 个答案:

答案 0 :(得分:2)

它没有特殊名称或任何名称,只是将属性分配给对象。这是标准的默认PHP,据我所知,您不能禁用/关闭此功能。

我们所做的$object->newProp = 'foo'就是将带有值的新键添加到对象,一旦添加,该键+值对将不再全局可用。仅用于该对象。数组的原理相同:

$array = [1, 2, 3];
$array[] = 4;

我们正在对您的对象进行相同操作

$object = new Class();
$object->foo = 4;

答案 1 :(得分:0)

我会创建一个“魔术” __set()函数,该函数不设置参数,而是返回错误/警告。

public function __set ( string $name , mixed $value ) {
    if( in_array( $name, [ 'various', 'valid', 'properties' ] ) ) {
        $this->$name = $value;
    } else {
        trigger_error( "Setting unknown property ".__CLASS__."->$name is not permitted." );
    }
}

https://www.php.net/manual/en/language.oop5.overloading.php#object.set