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
}
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
}
Spróbuj rozszerzenie ArrayObject
Po prostu dodaj implements ArrayAccess
do swojej klasy i dodaj wymagane metody:
Będziesz musiał zaimplementować interfejs ArrayAccess
, aby to zrobić - co oznacza tylko zaimplementowanie kilku (dokładnie 4) proste metody:
ArrayAccess::offsetExists
: Czy istnieje offset.ArrayAccess::offsetGet
: Zwraca wartość w określonym przesunięciu.ArrayAccess::offsetSet
: Przypisuje wartość do określonego przesunięcia.ArrayAccess::offsetUnset
: Usuwa offset.Jest pełny przykład na stronie podręcznika Wskazałam ;-)
@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 ^^ –
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.
Twój obiekt musi implementować interfejs ArrayAccess
, to PHP będzie można używać nawiasów kwadratowych w tym stylu.
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'];
Można również rzutować obiekt jako tablicy:
if((array)$obj['foo'] == 'bar'){
//more code here
}
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
Uaktualnianie, ponieważ syntaktyczny cukier. – aross
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
mam ten klasę Obj rozciąga ArrayObject {} Ale kiedy robię moje testy jednostkowe, otrzymuję błąd w powyższym. – oxfletchox
tak, teraz musisz zdefiniować tam funkcje __get() i __set(). Na przykład funkcja __get ($ n) {return $ this [$ n]; } –
Dziękuję bardzo, brakowało mi funkcji pomocnika. – oxfletchox