2012-03-29 14 views
4

Ich versuche, die Zeichenfolge "diese Info" innerhalb dieses Objekts zu erhalten, rufen Sie es $object, aber Daten sind geschützt, wie kann ich auf diese Tasche zugreifen?Get Zeichenfolge im geschützten Objekt

object(something)#29 (1) { 
    ["_data":protected]=> 
    array(10) { 
    ["Id"]=> 
    array(1) { 
     [0]=> 
     string(8) "this info" 
    } 
    ["SyncToken"]=> 
    array(1) { 
     [0]=> 
     string(1) "0" 
    } 
    ["MetaData"]=> 
    array(1) { 

Offensichtlich $object->_data ist mir ein Fehler Cannot access protected property

+1

Wenn der Wert geschützt ist, dann gibt es einen ganz guten Grund, „warum“. –

+1

Nun, ich habe das gleiche Problem konfrontiert Quickbook api :) –

Antwort

4

Wenn Sie - oder der Schriftsteller der Klasse - wollen, dass andere Personen Zugang zu einem geschützten oder Privateigentum haben, müssen Sie über eine Getter-Methode schaffen, dass in der Klasse selbst.

So in der Klasse:

public function getData() 
{ 
    return $this->_data; 
} 

Und in Ihrem Programm:

$object->getData(); 
0

Sie können die berühmten Getter und Setter-Methoden an private/geschützten Eigenschaften verwenden. Ex:

<?php 

class myClass 
{ 
    protected $helloMessage; 

    public function getHelloMessage() 
    { 
     return $this->helloMessage; 
    } 

    public function setHelloMessage($value) 
    { 
     //Validations 
     $this->helloMessage = $value; 
    } 
} 

?> 

Grüße,

Estefano.

5

Es gibt ein paar alternative Möglichkeiten, um private/geschützte Eigenschaften eines Objekts zu erhalten, die keine Änderung des ursprünglichen Quellcodes erfordern.

Option 1-Reflection:

Wikipedia definiert Reflexion als

... die Fähigkeit eines Computerprogramms zu untersuchen und die Struktur und das Verhalten (insbesondere die Werte, Meta-Daten zu ändern , Eigenschaften und Funktionen) des Programms zur Laufzeit. [Reflection (computer_programming)]

In diesem Fall Sie Reflektion verwenden möchten, um die Eigenschaften des Objekts und setzen als zugänglich geschütztes Eigentum _data

ich nicht empfehlen Reflexion zu untersuchen, wenn Sie sehr spezifische Anwendungsfälle, wo es kann erforderlich sein. Dies ist ein Beispiel, wie Sie Ihre privaten/geschützten Parameter mit Reflexion mit PHP zu bekommen:

$reflector = new \ReflectionClass($object); 
$classProperty = $reflector->getProperty('_data'); 
$classProperty->setAccessible(true); 
$data = $classProperty->getValue($object); 

Option 2 - Subklassen (geschützte Eigenschaften only):

Wenn die Klasse nicht final, können Sie Erstellen Sie eine Unterklasse des Originals. Dadurch erhalten Sie Zugriff auf die geschützten Eigenschaften. In der Unterklasse könnten Sie Ihre eigenen Getter-Methoden schreiben:

Hoffe, das hilft.

0

Um eine geschützte Eigenschaft abzurufen, können Sie die ReflectionProperty-Schnittstelle verwenden.

Die phptoolcase hat eine Phantasie-Methode für diese Aufgabe:

public static function getProperty($object , $propertyName) 
     { 
      if (!$object){ return null; } 
      if (is_string($object)) // static property 
      { 
       if (!class_exists($object)){ return null; } 
       $reflection = new \ReflectionProperty($object , $propertyName); 
       if (!$reflection){ return null; } 
       $reflection->setAccessible(true); 
       return $reflection->getValue(); 
      } 
      $class = new \ReflectionClass($object); 
      if (!$class){ return null; } 
      if(!$class->hasProperty($propertyName)) // check if property exists 
      { 
       trigger_error('Property "' . 
        $propertyName . '" not found in class "' . 
        get_class($object) . '"!' , E_USER_WARNING); 
       return null; 
      } 
      $property = $class->getProperty($propertyName); 
      $property->setAccessible(true); 
      return $property->getValue($object); 
     } 


$value = PtcHandyMan::getProperty($your_object , ‘propertyName’); 

$value = PtcHandyMan::getProperty(‘myCLassName’ , ‘propertyName’); // singleton 
Verwandte Themen