我如何绕过“受保护”,以便输出数据。
tabs\api\property\Property Object (
[id:protected] => 90_4_HH
[propertyRef:protected] => 90_4
[brandCode:protected] => HH
[url:protected] => http://hh.api.carltonsoftware.co.uk/property/90_4_HH
[accountingBrand:protected] => HH
[slug:protected] => 90-4-hh
[name:protected] => Carreg Lwyd Farmhouse
[address:protected] => tabs\api\core\Address Object (
[addr1:protected] => Port Eynon
[addr2:protected] =>
[town:protected] => Gower
[county:protected] => Swansea
[postcode:protected] => SA3 1NN
[country:protected] => GB
)
[changeOverDay:protected] => Saturday
[calendar:protected] => http://hh.api.carltonsoftware.co.uk/property/90_4_HH/calendar
[booking:protected] => http://hh.api.carltonsoftware.co.uk/booking
[pets:protected] =>
[promote:protected] =>
[smoking:protected] =>
[shortlist:protected] =>
[accommodates:protected] => 12
[rating:protected] => 5
[bedrooms:protected] => 6
[images:protected] => Array (
[90_4p1190276.jpg?APIKEY=homefromhome&hash=31b3f7b1b377184e8cb8fb64d434a11a4c3446c1091535ef6db4e119689a6372] => tabs\api\property\Image Object (
[filename:protected] => 90_4p1190276.jpg?APIKEY=homefromhome&hash=31b3f7b1b377184e8cb8fb64d434a11a4c3446c1091535ef6db4e119689a6372
[title:protected] => Carreg Lwyd Farmhouse, Port Eynon
[alt:protected] => The Lounge
[url:protected] => http://hh.api.carltonsoftware.co.uk/image/normal/1000x750/90_4p1190276.jpg
[height:protected] => 750
[width:protected] => 1000
[apiPath:protected] => http://hh.api.carltonsoftware.co.uk
)
[90_4img_4819.jpg?APIKEY=homefromhome&hash=31b3f7b1b377184e8cb8fb64d434a11a4c3446c1091535ef6db4e119689a6372] => tabs\api\property\Image Object (
转储:
foreach ($properties as $property) {
echo sprintf('<p class="listit">%s</p>', $property);
print_r($property);
}
答案 0 :(得分:1)
你的标题暗示你要制作 - 类(不是对象) - public,而不是“internal”/ etc。所有类都是PHP公开的。
你的问题是你想要绕过方法/属性范围(不同意标题)。你没有说你尝试过什么。您也没有说明这是否是您开发的课程。如果您可以控制它,请添加一两个怪物,以便您获取数据。如果不这样做,则检查方法和/或尝试反射。这些答案适用于现有的每种OOP语言。
在询问其他人之前,请阅读文档。
答案 1 :(得分:1)
我没有完全理解您的问题,但如果您想从课外访问 protected 属性,则必须使用Reflection:
$reflObj = new ReflectionObject($property);
$props = $reflObj->getProperties(ReflectionProperty::IS_PROTECTED);
foreach ($props as $prop) {
$prop->setAccessible(true);
echo $prop->getName() . ":" . $prop->getValue($property), "\n";
}
输出地址的示例:
$reflObj = new ReflectionObject($property);
$addrProp = $reflObj->getProperty('address');
$addrProp->setAccessible(true);
echo $addrProp->getValue($property);
答案 2 :(得分:0)
对标题提出的问题的回答是所有课程都是公开的。
您要问的是如何访问受保护的成员变量。
从这里(http://ajmm.org/2011/06/using-php-reflection-to-read-a-protected-property/)取得,这是如何做到这一点的一个例子:
public static function getReflectedPropertyValue($class, $propertyName)
{
$reflectedClass = new ReflectionClass($class);
$property = $reflectedClass->getProperty($propertyName);
$property->setAccessible(true);
return $property->getValue($class);
}
...
getReflectedPropertyValue($yourObject, 'protectedProperty');
那就是说,问题是你想要这样做的原因。成员受到特别保护,以防止您这样做。如果您可以访问定义此其他类的源代码,那么将这些成员更改为“public”或(更好)为您要访问的任何属性提供getXYZ()方法可能更有意义。