如何根据对象方法内的给定参数创建属性?
class Foo{
public function createProperty($var_name, $val){
// here how can I create a property named "$var_name"
// that takes $val as value?
}
}
我希望能够访问该属性,例如:
$object = new Foo();
$object->createProperty('hello', 'Hiiiiiiiiiiiiiiii');
echo $object->hello;
我是否可以将财产设为公共/受保护/私有?我知道在这种情况下它应该是公开的,但我可能想添加一些magik方法来获取受保护的属性和东西:)
protected $user_properties = array();
public function createProperty($var_name, $val){
$this->user_properties[$var_name] = $val;
}
public function __get($name){
if(isset($this->user_properties[$name])
return $this->user_properties[$name];
}
你觉得这是个好主意吗?
有两种方法可以实现。
一,可以直接从类外部动态创建属性:
class Foo{
}
$foo = new Foo();
$foo->hello = 'Something';
或者,如果您希望通过
createProperty
方法创建财产:
class Foo{
public function createProperty($name, $value){
$this->{$name} = $value;
}
}
$foo = new Foo();
$foo->createProperty('hello', 'something');
以下示例适用于那些不想声明整个类的人。
$test = (object) [];
$prop = 'hello';
$test->{$prop} = 'Hiiiiiiiiiiiiiiii';
echo $test->hello; // prints Hiiiiiiiiiiiiiiii
财产超载非常慢。如果可以的话,尽量避免。同样重要的是实现其他两个魔术方法:
__isset(); __unset();
如果您不想以后在使用这些对象“属性”时发现一些常见错误
以下是一些示例:
http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members
亚历克斯评论后编辑:
您可以自己检查两种解决方案之间的时间差异(更改 $REPEAT_PLEASE)
<?php
$REPEAT_PLEASE=500000;
class a {}
$time = time();
$a = new a();
for($i=0;$i<$REPEAT_PLEASE;$i++)
{
$a->data = 'hi';
$a->data = 'bye'.$a->data;
}
echo '"NORMAL" TIME: '.(time()-$time)."\n";
class b
{
function __set($name,$value)
{
$this->d[$name] = $value;
}
function __get($name)
{
return $this->d[$name];
}
}
$time=time();
$a = new b();
for($i=0;$i<$REPEAT_PLEASE;$i++)
{
$a->data = 'hi';
//echo $a->data;
$a->data = 'bye'.$a->data;
}
echo "TIME OVERLOADING: ".(time()-$time)."\n";
使用语法:$object->{$property} 其中 $property 是一个字符串变量并且 如果 $object 在类或任何实例对象内部,则它可以是 this
实例:http://sandbox.onlinephpfunctions.com/code/108f0ca2bef5cf4af8225d6a6ff11dfd0741757f
class Test{
public function createProperty($propertyName, $propertyValue){
$this->{$propertyName} = $propertyValue;
}
}
$test = new Test();
$test->createProperty('property1', '50');
echo $test->property1;
结果:50
警告
永远不要使用动态属性!!! 你的代码设计很糟糕。
自 php 8.2 起,动态属性已被弃用
更多信息 - https://www.php.net/manual/en/migration82.deprecated.php