2010-02-22 14 views
2

Quelle interface PHP SPL permet aux objets de le faire:Quelle interface PHP permet d'accéder aux propriétés des objets avec la notation de tableau?

$object->month = 'january'; 
echo $object['month']; // january 

$record['day'] = 'saturday'; 
echo $record->day; // saturday 

par exemple comme dans les bibliothèques comme Doctrine (Doctrine_Record)

comment puis-je implémenter cela? J'ai essayé d'utiliser ArrayObject, mais ils ne se comportent pas comme je le pensais.

à savoir

$object = new ArrayObject(); 
$object['a'] = 'test'; 
$object['a'] == $object->a; // false 

EDIT:

J'ai essayé une implémentation barebone que j'ai appelé Array,.

class Arrayable implements ArrayAccess 
{ 
    protected $container = array(); 

    # implement ArrayAccess methods to allow array notation 
    # $object = new Arrayable(); 
    # $object['value'] = 'some data'; 

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

    function offsetGet($offset) 
    { 
     return $this->container[$offset]; 
    } 

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

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

    # now, force $object->value to map to $object['value'] 
    # using magic methods 

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

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

Répondre

4

Il est ArrayAccess

Voir la sourcecode for Doctrine_Record

abstract class Doctrine_Record 
    extends Doctrine_Record_Abstract 
    implements Countable, IteratorAggregate, Serializable 

et Doctrine_Record_Abstract

abstract class Doctrine_Record_Abstract extends Doctrine_Access 

et enfin Doctrine_Access

abstract class Doctrine_Access 
    extends Doctrine_Locator_Injectable 
    implements ArrayAccess 

De DocBlock

fournit une interface d'accès au tableau et la surcharge de propriété pour les sous-classes Doctrine


Un objet qui implémente ArrayAccess doit avoir ces méthodes

abstract public boolean offsetExists (mixed $offset ); 
abstract public mixed offsetGet (mixed $offset); 
abstract public void offsetSet (mixed $offset , mixed $value); 
abstract public void offsetUnset (mixed $offset); 

Il y a un exemple d'utilisation de base dans le manuel PHP (lié abo ve)

0

Je pense que vous pouvez jeter objet et tableaux ..

$object = (object)array('name'=>'aviv'); 
echo $object->name; // prints aviv 

et vice versa ..

$array= (array)$object; 
echo $array['name']; // prints aviv 
3

Vous utilisez deux choses différentes:

L'interface ArrayAccess pour $a[key] et http://php.net/manual/en/language.oop5.overloading.php pour $a->key

Qu'advient est

$a[key] appellera $a->offsetGet(key) (hérité de ArrayAccess) et $a->key appellera $a->__get(key) ou $a->__set(key, val) (dans des contextes comme $a->key = val).

0

Vous pouvez implémenter votre propre classe par ex.

class PropertyTest { 
$month; 
} 

puis dans le code utilisé

$object = new PropertyTest; 
$object->month = "January"; 
echo $obejct->month; 
+0

L'OP veut savoir comment accéder à l'objet avec la notation de tableau, par exemple '$ object ['month']' en plus de '$ object-> month'. – Gordon

0

Je réponds à la question en utilisant votre code d'exemple avec un ajout mineur:

<?php 
$object = new ArrayObject([], ArrayObject::ARRAY_AS_PROPS); 

$object['a'] = 'test'; 
var_dump($object['a'] == $object->a); // expected: bool(true) 

$object->month = 'january'; 
echo $object['month'];    // expected: january 

$object['day'] = 'saturday'; 
echo $object->day;     // expected: saturday 

Demo: https://3v4l.org/Nd5NW


ArrayObject accepte un 2ème argument du constructeur, qui est soit

  • ArrayObject :: STD_PROP_LIST propriétés de l'objet ont leur fonctionnement normal en cas d'accès liste (var_dump, foreach, etc.).

  • ArrayObject :: ARRAY_AS_PROPS entrées sont accessibles en tant que propriétés (lecture et écriture).

Référencer: http://php.net/manual/de/class.arrayobject.php