这个线程对我没有帮助。
如果我使用
$class_vars = get_class_vars(get_class($this));
foreach ($class_vars as $name => $value) {
echo "$name : $value'n";
}
我得到
attrib1_name:attrib2_name:attrib3_name
没有值。还显示了一个私有属性,这是我不想要的。
如果我使用
echo "<pre>";
print_r(get_object_vars($this));
echo "</pre>";
我得到
阵列([atrrib1_name]=>属性1_value[attrib2_name]=>attrib2_value)
这里我又有一个私有属性和所有子属性。但这一次我有了价值观。如何将其限制在一个级别?
难道不存在用对象的值来显示所有公共属性的可能性吗?
您看到的是非公共属性,因为get_class_vars
根据当前范围工作。由于您使用的是$this
,您的代码在类内,因此非公共属性可以从当前作用域访问。get_object_vars
也是如此,这可能是一个更好的选择。
在任何情况下,一个好的解决方案都是将检索属性值的代码移出类。
如果你不想为此创建一个免费函数(为什么?说真的,重新考虑!),你可以使用一个涉及匿名函数的技巧:
$getter = function($obj) { return get_object_vars($obj); };
$class_vars = $getter($this);
在实际操作中查看。
更新:由于您使用的是PHP<5.3.0,您可以使用此等效代码:
$getter = create_function('$obj', 'return get_object_vars($obj);');
$class_vars = $getter($this);
您可以使用php反射api 轻松完成此操作
扩展Mr.Coder的答案,这里有一个片段,用于获取对象的公共属性(名称和值)作为数组
public function getPublicProperties()
{
$results = [];
$reflectionObject = (new ReflectionObject($this));
$properties = $reflectionObject->getProperties(ReflectionProperty::IS_PUBLIC);
foreach ($properties as $property) {
$results[$property->getName()] = $property->getValue($this);
}
return $results;
}
使用get_object_vars。请参阅:http://dk.php.net/manual/en/function.get-object-vars.php
我完全认识到你正在努力实现的目标,所以为什么不有这样的外部帮助呢。。。(粘贴自PHPFiddle)
<?php
final class utils {
public static function getProperties(& $what) {
return get_object_vars($what);
}
}
class ball {
var $name;
private $x, $y;
function __construct($name,$x,$y) {
}
function publicPropsToArray() {
return utils::getProperties($this);
}
function allPropsToArray() {
return get_object_vars($this);
}
}
$ball1 = new ball('henry',5,6);
//$ball2 = new ball('henry',3,4);
echo "<pre>";
print_r($ball1->publicPropsToArray());
echo "'r'n'r'n";
print_r($ball1->allPropsToArray());
echo "'r'n'r'n";
?>
通过这种方式,我既可以访问对象的所有属性,也可以访问数据库访问层之类的东西,或者类似地,对于向视图或其他非特权模型发送"安全"数据的函数,我可以只发送公共属性,但在对象内定义行为。
当然,这会导致与实用程序类的耦合,但公平地说,并不是所有的耦合都是坏的,有些耦合很难实现最终目标,不要被这些事情所困扰