我刚刚了解到您可以设置类的任何属性(只要未明确将其声明为私有属性即可)。例如:
class Test {}
$test = new Test;
$test->randomthing = 'Hello world';
var_export($test);
可以很好地设置randomthing
对象的属性$test
。
我正在尝试找出此行为的含义,以及是否有可能消除/禁用此行为(以最大程度地减少代码中的错误),因为按照目前的状态,我可能会输入我想要的属性而没有及时注意到
理想情况下,我希望拥有:
class User {
protected $name;
}
然后我希望能够设置一个$user->name = ''
,但不能设置$user->randomthing = ''
。理想情况下,第二个调用将引发异常或某些异常。
我试图通过查找“动态属性”来猜测这个约定,但这似乎是指像双美元语法这样的东西,它通过变量中的值来引用属性。
那么,您怎么称呼这种行为?我在哪里可以读到更多有关控制(或禁用)的信息?
答案 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