Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

SPL: ArrayAccess interface ¿ Donde se ha metido ?

Estas en el tema de SPL: ArrayAccess interface ¿ Donde se ha metido ? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola. Estaba con cositas MVC, metodo __autoload y por spl, Singleton, ActiveRecord... Cuando encontré dos articulos muy interesantes en los que se hablaba de la ...
  #1 (permalink)  
Antiguo 25/10/2007, 02:56
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 3 meses
Puntos: 2
SPL: ArrayAccess interface ¿ Donde se ha metido ?

Hola.

Estaba con cositas MVC, metodo __autoload y por spl, Singleton, ActiveRecord... Cuando encontré dos articulos muy interesantes en los que se hablaba de la interfaz ArrayAccess
http://jmsala.wordpress.com/2007/06/...istro-en-php5/
http://web2development.blogspot.com/
Hice la implementación en una de mis clases [class a implements ArrayAccess] y le puse los 4 metodos que requiere... los offsets y eso que comienzo a hacer llamadas, sets y gets usando ArrayAccess y veo que no funciona .... yo claro me comienzo a moskear... hago un <?php echo phpinfo(); ?> y veo lo siguiente:

Cita:
SPL support enabled

Interfaces: Countable, OuterIterator, RecursiveIterator, SeekableIterator, SplObserver, SplSubject

Classes: AppendIterator, ArrayIterator, ArrayObject, BadFunctionCallException, BadMethodCallException, CachingIterator, DirectoryIterator, DomainException, EmptyIterator, FilterIterator, InfiniteIterator, InvalidArgumentException, IteratorIterator, LengthException, LimitIterator, LogicException, NoRewindIterator, OutOfBoundsException, OutOfRangeException, OverflowException, ParentIterator, RangeException, RecursiveArrayIterator, RecursiveCachingIterator, RecursiveDirectoryIterator, RecursiveFilterIterator, RecursiveIteratorIterator, RecursiveRegexIterator, RegexIterator, RuntimeException, SimpleXMLIterator, SplFileInfo, SplFileObject, SplObjectStorage, SplTempFileObject, UnderflowException, UnexpectedValueException
Vale ya entiendo por que no iba... ¿ y la interfaz ArrayAccess que en teoria viene por defecto con las clases del grupo de Zend engine ? tengo la versión 5.2.4.4 de php (la versión actual y estable).

Pues básicamente eso... ¿ Donde anda ? ¿ Como la habilito ? :S

Muchas gracias
Buenos días
  #2 (permalink)  
Antiguo 25/10/2007, 07:14
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: SPL: ArrayAccess interface ¿ Donde se ha metido ?

Hola, que tal si posteas tu clase para mirar la implementación de la interfaz ArrayAccess, ya de esa forma te podríamos ayudar mejor, no??

http://www.php.net/~helly/php/ext/sp...rayAccess.html

Necesitas implementar estos métodos en tu clase:
Cita:
Public Member Functions
offsetExists ($offset)
offsetGet ($offset)
offsetSet ($offset, $value)
offsetUnset ($offset)
  #3 (permalink)  
Antiguo 25/10/2007, 12:18
Avatar de Seppo  
Fecha de Ingreso: marzo-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.284
Antigüedad: 19 años, 1 mes
Puntos: 17
Re: SPL: ArrayAccess interface ¿ Donde se ha metido ?

yoguuu, en mi phpinfo tampoco aparece la interface, pero sin embargo la tengo definida... probá que te devuelve interface_exists('ArrayAccess');
  #4 (permalink)  
Antiguo 25/10/2007, 17:24
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 3 meses
Puntos: 2
Re: SPL: ArrayAccess interface ¿ Donde se ha metido ?

Hola amigos, no puse el código por ke pensé que sería algo más de configuración de directivas, de extensiones, de versiones o simplemente de tener o no habilitado...

No obstante como dice 'Seppo' que a él tampoco le sale reflejada la interfaz en el phpinfo(); imagino entonces si debe ser un problema en código.

Bueno pongo entonces el codigo. Uso una estructura de directorios como esto que sigue y voy a concretar poniendo solamente los archivos en relación a este problema con arrayaccess:

Cita:
/libs
config.class.php
/models
/views
/controllers
index.php
/libs/config.class.php

Bueno una simple clase de configuración que usa singleton y ahora mismo la función básica es solo definir y devolver valores en el array $config;, pero me gustaría poder hacerlo usando ArrayAccess.
Código PHP:
<?php
class config implements ArrayAccess {
    
    
// Attribute Members
    
private static $instance;
    private 
$config = array();
    
    
// Calls to a constructor disabled
    
private function __construct() {}
    
    
// Singleton Method
    
public static function getInstance() {
        if (!isset(
self::$instance)) {
            
$c __CLASS__;
            
self::$instance = new $c;
        }
        return 
self::$instance;
    }
    
    
// Prevenir a los usuarios de poder clonar la instancia
    
public function __clone() {
        
trigger_error('No está permitido clonar.'E_USER_ERROR);
    }
    
    
// Custom set, unset & get for ArrayAccess Interface
    
public function set($key$var) {
        if (isset(
$this->config[$key]) == true) {
            throw new 
Exception('Imposible definir la variable' $key '. Ya definida.');
        }
        return 
$this->config[$key] = $var;
    }
    function 
get($key) {
        if (isset(
$this->config[$key]) == false) {
            return 
null;
        }
        return 
$this->config[$key];
    }
    function 
remove($key) {
        if (isset(
$this->config[$key])) {
            unset(
$this->config[$key]);
        }        
    }
    
    
// ArrayAccess Interface Method's
    
public function offsetExists($offset) {
        return isset(
$this->config[$offset]);
    }
    public function 
offsetGet($offset) {
        return 
$this->get($offset);
    }
    public function 
offsetSet($offset$value) {
        
$this->set($offset$value);
    }
    public function 
offsetUnset($offset) {
        unset(
$this->config[$offset]);
    }
    
    
// Tal como me sugería 'Seppo' Comprobaremos la interfaz
    
function iExist() {
        
$a interface_exists('ArrayAccess');
        echo 
$a;
    }
}
?>
index.php

Bueno este será el punto de arranque de este proyecto, que actualmente tiene el diseño sin construir, solo es un boceto si hablamos de aplicación o web. Desde ahí creo constantes de rutas, meto un autoload e instancio la clase config y la uso. Pero usando el array access :S no defino ni obtengo nada... no obstante la funcion que comprueba la interfaz devuelve 1 (true).
En este, solo comentaré, no quitaré el codigo ke no es relevante para esta duda.
Código PHP:
<?php
define
("APP_ROOT"'./');
define("DS"'/');
define("LIBS_PATH"APP_ROOT.'libs'.DS);
//define("MODELS_PATH", APP_ROOT.'models'.DS);
//define("CONTROLLERS_PATH", APP_ROOT.'controllers'.DS);
//define("VIEWS_PATH", APP_ROOT.'views'.DS);
//define("CONFIG_PATH", APP_ROOT.'config'.DS);

function __autoload($class) {
    require_once 
LIBS_PATH $class ".class.php";
}
//require_once CONFIG_PATH.'config.php';
//require_once CONTROLLERS_PATH.'front.controller'.php

/*
* BUENO PUES AKI TENEIS UN EJEMPLO DE COMO INSTANCIO LA CLASE
* Y DE COMO INTENTO USAR EL ARRAYACCESS SIN MUCHO EXITO xD
* A VER SI PUEDEN AYUDARME ! :)
*
**/
$config config::getInstance();
$config->iExist(); // Existe la interfaz ? 1 == TRUE; 0 == FALSE; Devuelve 1 ! 
$config->['DB_Driver'] = 'mysql'// Seteamos la variable
echo $config['DB_Driver']; // recogemos la variable

?>
Bueno lo dicho ! a ver si podeis ayudarme :S Por ke no logro entender por que no está funcionando

Gracias :D
  #5 (permalink)  
Antiguo 25/10/2007, 21:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: SPL: ArrayAccess interface ¿ Donde se ha metido ?

Creo aqui es donde tienes el error:
Código PHP:
$config->['DB_Driver'] = 'mysql'// Seteamos la variable
echo $config['DB_Driver']; // recogemos la variable 
La interfaz ArrayAccess te hace el acceso como un arreglo, es decir asi tienes que setear y leer los valores:
Código PHP:
$config['DB_Driver'] = 'mysql'// Seteamos la variable
echo $config['DB_Driver']; // recogemos la variable 
Saludos.
  #6 (permalink)  
Antiguo 26/10/2007, 02:59
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 3 meses
Puntos: 2
Re: SPL: ArrayAccess interface ¿ Donde se ha metido ?

Si GatorV esto que comentas lo probé también incluso antes de postear y funciona pero haciendo esto lo que estaría creando no es un array fuera del contexto del objeto aunque tenga el mismo nombre el array que la instancia que yo hice y el objeto clase config ?

es decir:

Si yo hago $miNuevoArray['claveAsociativo'] = 'valor'; akí he asignado un valor a una clave asociativa del array $miNuevoArray. Que este array se llame igual que la instacia que yo usé, en mi caso $config['...'] no seguiría siendo fuera del ambito de objetos ? es decir... procedural ? O es precisamente así, ArrayAccess simplemente posibilita hacer esto, de esta manera ! :) Sería ideal si así es.

Un saludo, a ver que me comentas, o cualquier otra persona... es entonces la duda que me queda.

EDITO: He mirado el codigo de uso del activerecord en tu articulo de tu blog GatorV (lo referencio de nuevo por si alguien puede estar interesado y no se pierda, http://web2development.blogspot.com/ ) y bueno veo que es así como se usa parece ser que mientras sea dentro de la instancia sigue referiendo como objetos aunque modifique la sintaxis ArrayAcces suprimiendo "->" por directamente la key $instancia['key'];

Brutal :D
Gracias aún así me gustaría saber si coincidimos en esta opinión pues tiendo a montarme mis pajas mentales xD

Última edición por yoguuu; 26/10/2007 a las 03:06
  #7 (permalink)  
Antiguo 26/10/2007, 07:48
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: SPL: ArrayAccess interface ¿ Donde se ha metido ?

La interfaz ArrayAccess precisamente es lo que te permite hacer referenciar a un objeto como un arreglo sin perder la instancia.

Saludos.
  #8 (permalink)  
Antiguo 26/10/2007, 09:49
 
Fecha de Ingreso: octubre-2007
Mensajes: 21
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: SPL: ArrayAccess interface ¿ Donde se ha metido ?

Ya mas o menos voy entendiendo Singleton xD!! la cosa es con ejemplos asi cualkiera entiende :D

Gracias yoguuu y GatorV

Seguire testeando mi codigo cualkier duda posteo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:04.