如何公开对象?

时间:2013-09-04 20:34:02

标签: php

我如何绕过“受保护”,以便输出数据。

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);
}

3 个答案:

答案 0 :(得分:1)

你的标题暗示你要制作 - 类(不是对象) - public,而不是“internal”/ etc。所有类都是PHP公开的。

你的问题是你想要绕过方法/属性范围(不同意标题)。你没有说你尝试过什么。您也没有说明这是否是您开发的课程。如果您可以控制它,请添加一两个怪物,以便您获取数据。如果不这样做,则检查方法和/或尝试反射。这些答案适用于现有的每种OOP语言。

在询问其他人之前,请阅读文档。

http://www.php.net/manual/en/language.oop5.basic.php

答案 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()方法可能更有意义。