【问题标题】:Accessing StdClass value with colon :protected使用冒号访问 StdClass 值 :protected
【发布时间】:2014-01-07 10:12:17
【问题描述】:

如何使用冒号 ":protected" 访问 stdClass 的值?

例如,我有这个 $obj 有以下结果:

object(Google_Service_Plus_PeopleFeed)#14 (11) {
  ["title"]=>
  string(30) "Google+ List of Visible People"
  ["totalItems"]=>
  int(4)
  ["collection_key:protected"]=>
  string(5) "items"
  ["data:protected"]=>
  array(1) {
    ["items"]=>
    array(2) {
      [0]=>
      array(7) {
        ["kind"]=>
        string(11) "plus#person"
        ["etag"]=>
        string(57) ""42gOj_aEQqJGtTB3WnOUT5yUTkI/1eNkvlfeTwXXldr9rYAvMcwM6bk""
        ["objectType"]=>
        string(6) "person"

例如,我尝试使用以下代码访问“kind”值,即“plus#person”:

$kind = $obj->{'data:protected'}->items[0]->kind; //-> returns NULL
//OR
$kind = $obj->{data:protected}->items[0]->kind; //->returns error on ":"

好吧,它们似乎不起作用...知道如何访问受保护的数据吗?

谢谢

【问题讨论】:

  • 没有访问器吗?

标签: php stdclass


【解决方案1】:

它不是stdClass 对象,它是Google_Service_Plus_PeopleFeed 类的对象。您无法[轻松]访问类的受保护属性。如果班级不希望您访问数据,那么您不应该这样做。但通常该类提供一些您可以调用以获取数据的方法,例如$obj->getData() 或类似的方法。查看类定义或其文档,了解您应该如何使用该类。

【讨论】:

  • 我明白了。所以从我得到的,我需要找出在类中访问受保护数据的方法吗?谢谢
  • 这不是 100% 正确的。您可以通过不同的方式访问类的受保护成员!您可以使用反射,也可以子类化,甚至可以使用闭包。看我的回答。
  • @Mathias 当然,有很多方法可以解决“受保护”属性。 但你不应该这样做。它们被标记为protected 是有原因的。除非您绝对知道自己在做什么,否则您应该使用 public API,如果您应该访问该数据,则该 API 肯定存在。
  • 是的。也许你应该把这个放在你的答案中——我认为“根本不可能”具有误导性。在某些情况下,人们可能会被敦促访问受保护的变量——(例如,解决框架内的错误等)——对于这些情况,我添加了一个可能的解决方案。
  • 好吧,很公平。
【解决方案2】:

您无法从该对象外部访问受保护的属性。看http://www.php.net/manual/en/language.oop5.visibility.php

【讨论】:

    【解决方案3】:

    好吧,我终于可以使用了:

    $kind = $obj['data']['items'][0]['kinds'];
    

    谁能解释为什么?只是好奇为什么需要保护它>.

    【讨论】:

    • 这意味着该类正在实现ArrayAccess 接口,因此您可以像访问数组一样访问它。不过,可能还有一个 getter 方法。
    【解决方案4】:

    请注意,这些属性受到保护可能是有原因的,因此您在尝试访问它们之前应该三思而后行。

    如果您需要访问受保护的变量,您可以使用反射,但可能有更简单的解决方案。通过将闭包绑定到对象,您应该能够从闭包中访问受保护的变量:

    class X {
       protected $a = 10;
       public $b = 20; 
    }
    
    
    $closure = function() {
              return get_object_vars($this);
    };
    
    $result = Closure::bind($closure, new X(), 'X');
    var_dump($result()); 
    

    【讨论】:

      猜你喜欢
      • 2019-12-18
      • 2018-04-18
      • 1970-01-01
      • 2012-06-29
      • 2016-11-12
      • 2014-10-17
      • 1970-01-01
      • 2013-01-25
      • 2015-06-18
      相关资源
      最近更新 更多