2010-01-05 14 views
17

muszę być w stanie ustawić mojego obiektu tak:PHP przedmiot podobny tablicy

$obj->foo = 'bar'; 

następnie po który jest ustawiony muszę następujące czynności, aby mogło być prawdziwe

if($obj['foo'] == 'bar'){ 
    //more code here 
} 

Odpowiedz

13

Spróbuj rozszerzenie ArrayObject

+0

mam ten klasę Obj rozciąga ArrayObject {} Ale kiedy robię moje testy jednostkowe, otrzymuję błąd w powyższym. – oxfletchox

+1

tak, teraz musisz zdefiniować tam funkcje __get() i __set(). Na przykład funkcja __get ($ n) {return $ this [$ n]; } –

+0

Dziękuję bardzo, brakowało mi funkcji pomocnika. – oxfletchox

14

Po prostu dodaj implements ArrayAccess do swojej klasy i dodaj wymagane metody:

  • offsetExists public function ($ offset)
  • public function offsetGet ($ offset)
  • public function offsetSet ($ offset, $ value)
  • public function offsetUnset ($ offsetu)

See http://php.net/manual/en/class.arrayaccess.php

9

Będziesz musiał zaimplementować interfejs ArrayAccess, aby to zrobić - co oznacza tylko zaimplementowanie kilku (dokładnie 4) proste metody:

Jest pełny przykład na stronie podręcznika Wskazałam ;-)

+0

@Gordon: ergh, dzięki! Generalnie kopiuję i wklejam nazwy klas/metod, aby uniknąć tego rodzaju pomyłki ... Tym razem pomyślałem "Mogę to napisać" ... Cóż, wygląda na to, że nie ^^ –

8

Ty mieszania obiektów i tablic. Można tworzyć i dostęp do obiektu tak:

$obj = new stdClass; 
$obj->foo = 'bar'; 

if($obj->foo == 'bar'){ 
// true 
} 

i tablicę tak:

$obj = new Array(); 
$obj['foo'] = 'bar'; 

if($obj['foo'] == 'bar'){ 
// true 
} 

można zdefiniować klasę i dodać narzędzi ArrayAccess jeśli chcesz uzyskać dostęp do klasę zarówno jako tablicę i klasa.

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

3

Twój obiekt musi implementować interfejs ArrayAccess, to PHP będzie można używać nawiasów kwadratowych w tym stylu.

13

ArrayObject implementuje interfejs ArrayAccess (i kilka innych). Używając flagi ARRAY_AS_PROPS zapewnia ona funkcjonalność, której szukasz.

$obj = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS); 
$obj->foo = 'bar'; 
echo $obj['foo']; 

Alternatywnie można zaimplementować interfejs ArrayAccess w jednym ze swoich własnych klas:

class Foo implements ArrayAccess { 
    public function offsetExists($offset) { 
    return isset($this->$offset); 
    } 

    public function offsetGet($offset) { 
    return $this->$offset; 
    } 

    public function offsetSet($offset , $value) { 
    $this->$offset = $value; 
    } 

    public function offsetUnset($offset) { 
    unset($this->$offset); 
    } 
} 

$obj = new Foo; 
$obj->foo = 'bar'; 
echo $obj['foo']; 
1

Można również rzutować obiekt jako tablicy:

if((array)$obj['foo'] == 'bar'){ 
    //more code here 
} 
6

Można Object Access PHP jako tablica PHP, ale na różne sposoby. Spróbuj tego:

$obj->{'foo'} 

który jest podobny z dostępu tablicę tak:

$arr['foo'] 

Można też to zrobić:

$propertyName = 'foo'; 
$obj->$propertyName; // same like first example 
+4

Uaktualnianie, ponieważ syntaktyczny cukier. – aross

1

Zwiększenie zdolności Klasa bez funkcjonalność minusy

Możesz również użyć ArrayAccess, aby uzyskać dostęp do właściwości jednej tablicy w klasie i pozostawić inne pr dostęp do właściwości w trybie OOP. Jednak nadal będzie działać tak, jak prosiłeś.

class Foo implements \ArrayAccess 
{ 

/** 
* mixed[] now you can access this array using your object 
* like a normal array Foo['something'] = 'blablabla'; echo Foo['something']; ... and so on 
* other properties will remain accessed as normal: $Foo->getName(); 
*/ 
private myArrayOptions = []; 

private $name = 'lala'; 

    ... 

    public function offsetExists($offset) 
    { 
     return isset($this->myArrayOptions[$offset]); 
    } 

    public function offsetGet($offset) 
    { 
     if ($this->offsetExists($offset)) { 
      return $this->myArrayOptions[$offset]; 
     } 

     return null; // or throw the exception; 
    } 

    public function offsetSet($offset, $value) 
    { 
     $this->myArrayOptions[$offset] = $value; 
    } 

    public function offsetUnset($offset) 
    { 
     unset($this->myArrayOptions[$offset]); 
    } 

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

    public function __set($offset, $value){ 
     $this->myArrayOptions[$offset] = $value; 
    } 

    ... 

} 

Powyższe działa zgodnie z oczekiwaniami.

$obj->foo = 'bar'; 
if($obj['foo'] == 'bar'){ 
    echo "WoWo"; 
} 

Należy również pamiętać, że Foo [ 'name'] ! == foo-> getName() a te dwie różne zmienne