This thread没有帮助我。
如果我使用
$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] =&gt; attrib1_value [attrib2_name] =&gt; attrib2_value )
这里我再次拥有私有属性和所有子属性。但这次我有价值观。如何将此约束到一个级别?
是否有可能用对象的值显示所有公共属性?
答案 0 :(得分:5)
您看到非公开属性,因为get_class_vars
根据当前范围工作。由于您使用$this
,因此您的代码在类中,因此非公共属性 可从当前范围访问。同样适用于get_object_vars
,这可能是更好的选择。
在任何情况下,一个好的解决方案是将检索属性值的代码移出类。
如果您不想为此创建免费功能(为什么?认真,重新考虑!),您可以使用涉及匿名功能的技巧:
$getter = function($obj) { return get_object_vars($obj); };
$class_vars = $getter($this);
<强> See it in action 强>
更新:因为您使用的是PHP&lt; 5.3.0,您可以使用此等效代码:
$getter = create_function('$obj', 'return get_object_vars($obj);');
$class_vars = $getter($this);
答案 1 :(得分:1)
您可以使用php Reflection api
轻松完成此操作答案 2 :(得分:0)
扩展Mr.Coder's answer,这里是一个片段,用于获取对象的公共属性(名称和值)作为数组
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;
}
答案 3 :(得分:-1)
使用get_object_vars。 见:http://dk.php.net/manual/en/function.get-object-vars.php
答案 4 :(得分:-1)
我完全认识到你想要达到的目标,所以为什么不用这样的东西来帮助...(从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";
?>
这样我既可以访问对象的所有属性,也可以访问诸如数据库访问层之类的内容,或类似地将“安全”数据发送到视图或其他非特权模型的函数,我只能发送公共属性,但在对象中定义了行为。
当然这会导致与实用类相结合,但公平地说并非所有耦合都是坏的,有些是实现最终目标的必要条件,不要被这些东西拖累