我刚刚了解到,您可以设置类的任何属性(只要它没有显式声明为私有属性)。例如:
class Test {}
$test = new Test;
$test->randomthing = 'Hello world';
var_export($test);
可以很好地设置$test
对象的randomthing
属性。
我正在尝试找出这种行为的名称,以及是否有可能消除/禁用它(以最小化代码中的错误),因为按照目前的情况,我可能会键入我想要的属性,而不会及时注意到。
理想情况下,我希望拥有:
class User {
protected $name;
}
然后我希望能够设置$user->name = ''
,但不能设置$user->randomthing = ''
。这第二个调用理想情况下会抛出一个异常或其他东西。
我试图通过查找“动态属性”来猜测这种约定,但这似乎是指通过变量中的值引用属性的双美元语法之类的东西。
那么,你把这种行为叫做什么呢?我在哪里可以了解到更多关于控制它(或禁用它)的信息?
发布于 2019-06-04 20:14:43
它没有特殊的名称或任何东西,它只是将一个属性分配给一个对象。这是标准的和默认的PHP -据我所知,这不是你可以禁用/关闭的东西。
我们所做的$object->newProp = 'foo'
就是向对象追加一个带有值的新键,这个键+值对一旦被添加就不是全局可用的。它只适用于该对象。数组的原理也是如此:
$array = [1, 2, 3];
$array[] = 4;
我们正在对您的对象执行相同的操作:
$object = new Class();
$object->foo = 4;
发布于 2019-06-05 03:28:40
我会创建一个“神奇的”__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
https://stackoverflow.com/questions/56443607
复制相似问题