2012-01-16 3 views
-2

EDIT: Спасибо всем. Я даже не заметил, что это был частный lol, поэтому я поменял их от частного к публичному, теперь он должен быть доступен ... вопрос теперь в том, как я могу получить доступ к значению «backpackPosition»? еще раз спасибо!значения объекта доступа php

TF2Inventory Object 
(
[fetchDate] => 123456123 
[items] => Array 
    (
     [60] => TF2Item Object 
      (
       [equipped] => Array 
        (
         [scout] => 1 
         [sniper] => 1 
         [soldier] => 1 
         [demoman] => 1 
         [medic] => 1 
         [heavy] => 1 
         [pyro] => 1 
         [spy] => 1 
        ) 

       [attributes] => Array 
        (
         [0] => stdClass Object 
          (
           [name] => custom employee number 
           [class] => set_employee_number 
           [value] => 0 
          ) 

         [1] => stdClass Object 
          (
           [name] => cannot trade 
           [class] => cannot_trade 
           [value] => 1 
          ) 

        ) 

       [backpackPosition] => 61 
       [className] => tf_wearable 
       [count] => 1 
       [defindex] => 170 
       [id] => 535518002 
       [level] => 20 
       [name] => Primeval Warrior 
       [quality] => unique 
       [slot] => misc 
       [tradeable] => 
       [type] => Badge 
      ) 

     [43] => TF2Item Object 
      (
       [equipped] => Array 
        (
         [scout] => 0 
         [sniper] => 0 
         [soldier] => 0 
         [demoman] => 0 
         [medic] => 0 
         [heavy] => 0 
         [pyro] => 0 
         [spy] => 0 
        ) 

       [attributes] => Array 
        (
         [0] => stdClass Object 
          (
           [name] => cannot trade 
           [class] => cannot_trade 
           [value] => 1 
          ) 

        ) 

       [backpackPosition] => 44 
       [className] => tf_wearable 
       [count] => 1 
       [defindex] => 471 
       [id] => 535518003 
       [level] => 50 
       [name] => Proof of Purchase 
       [quality] => unique 
       [slot] => head 
       [tradeable] => 
       [type] => Hat 
      ) 

     [42] => TF2Item Object 
      (
       [equipped] => Array 
        (
         [scout] => 1 
         [sniper] => 1 
         [soldier] => 1 
         [demoman] => 1 
         [medic] => 1 
         [heavy] => 1 
         [pyro] => 1 
         [spy] => 1 
        ) 

       [attributes] => 
       [backpackPosition] => 43 
       [className] => tf_wearable 
       [count] => 1 
       [defindex] => 278 
       [id] => 541628464 
       [level] => 31 
       [name] => Horseless Headless Horsemann's Head 
       [quality] => unique 
       [slot] => head 
       [tradeable] => 
       [type] => Hat 
      ) 

     [59] => TF2Item Object 
      (
       [equipped] => Array 
        (
         [scout] => 0 
         [sniper] => 0 
         [soldier] => 0 
         [demoman] => 0 
         [medic] => 0 
         [heavy] => 0 
         [pyro] => 0 
         [spy] => 0 
        ) 

       [attributes] => Array 
        (
         [0] => stdClass Object 
          (
           [name] => cannot trade 
           [class] => cannot_trade 
           [value] => 1 
          ) 

        ) 

       [backpackPosition] => 60 
       [className] => tf_wearable 
       [count] => 1 
       [defindex] => 115 
       [id] => 548155039 
       [level] => 10 
       [name] => Mildly Disturbing Halloween Mask 
       [quality] => unique 
       [slot] => head 
       [tradeable] => 
       [type] => Holiday Hat 
      ) 
+1

Доступен ли вы из-за пределов класса? Точка частного экземпляра vars заключается в том, что они не могут быть замечены ничем другим. –

+0

Вы не можете получить доступ к закрытым членам класса. Вот почему они частные. – afuzzyllama

+0

Возможный дубликат: http://stackoverflow.com/questions/1981878/how-would-i-access-this-object-value – cspray

ответ

2

Частные члены только что - частные. Только доступ к ним принадлежит только классу, к которому они принадлежат. Если вы хотите получить свои значения, вам необходимо либо сделать их защищенными (и, следовательно, доступными для родительских и дочерних классов), либо общедоступными (доступными для всех классов). Другой вариант заключается в написании некоторых добытчиками, функции, которые выглядят как

public function get_slot() { 
    return $this->slot; 
} 

или использовать магическую функцию __get(), чтобы сделать общий поглотитель, который выглядит как

public function __get($name) { 
    return $this->$name; 
} 

Более подробную информацию можно найти в документации на http://php.net/manual/en/language.oop5.visibility.php

+0

Несмотря на то, что метод getter magic действительно разрушает всю цель частных/защищенных переменных. –

+0

Не всегда. Метод __get() может клонировать возвращаемую переменную, что делает частную/защищенную переменную эффективной только для чтения. –

0

Вам потребуется аксессор метод для каждого объекта, чтобы получить доступ к значениям. Поскольку они являются частными, они могут быть доступны только в каждом из классов, к которым они принадлежат.

0

частные свойства просто могут доступ изнутри самого объекта. Чтобы получить доступ, попробуйте использовать $this->propertyName

0

Этот ответ предназначен для сценария попыток обойти введенное ограничение на личные данные, например, если вы случайно работаете с библиотекой, у которой у вас нет доступа для изменения уровня привилегий члена класса, то есть работа вокруг. Предположив объект сериализации/unserializable затем рассмотреть:

<?php 
class SourceProtected { 
    private $foo = 'one'; 
    protected $baz = 'two'; 
    public $bar = 'three'; 
} 

class SourceUnprotected { 
    public $foo = 'blah';  
    public $baz = 'two'; 
    public $bar = 'three'; 
} 


$protected = new SourceProtected(); 
$unprotected = new SourceUnprotected(); 
var_dump(serialize($protected), serialize($unprotected));  

Выходной сигнал выглядит примерно так:

string(110) "O:15:"SourceProtected":3:{s:20:"?SourceProtected?foo";s:3:"one";s:6:"?*?baz";s:3:"two";s:3:"bar";s:5:"three";}" 
string(92) "O:17:"SourceUnprotected":3:{s:3:"foo";s:4:"blah";s:3:"baz";s:3:"two";s:3:"bar";s:5:"three";}" 

Так одно решение, чтобы создать дубликат класса, который изменяет уровень привилегий на переменные для всех общественности. Затем сериализуйте рабочий объект, преобразуйте *** сериализованный класс в ваши версии, а затем просто несериализуйте строку, и у вас будет рабочий объект вашего типа класса с неограниченным доступом.

Очевидно, что метод конвертирования - это то, где вам нужно будет выполнить некоторую работу в ногах. Вам нужно либо построить обобщенный синтаксический анализатор, который может обрабатывать любой случай, либо вы можете закодировать хакерские работы только для вашей конкретной серии прецедентов str_replaces.

Смежные вопросы