Foros del Web » Programando para Internet » PHP »

Clave numérica en objeto?

Estas en el tema de Clave numérica en objeto? en el foro de PHP en Foros del Web. Estaba practicando e hice esto: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original $arr = array (     '100' => 'cien' ,     '200' => ...

  #1 (permalink)  
Antiguo 06/05/2011, 11:09
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Clave numérica en objeto?

Estaba practicando e hice esto:

Código PHP:
Ver original
  1. $arr = array (
  2.     '100' => 'cien',
  3.     '200' => 'doscientos'
  4. );
  5.  
  6. $p = (object) $arr;
Esto da error de tipo "Undefined property: stdClass::$100 in...":
Código PHP:
Ver original
  1. echo $p->100;
Y esto también:
Código PHP:
Ver original
  1. echo $p->{(string)100};
En realidad hice muchos intentos pero nada ¿cómo se soluciona? Es que obviamente no acepta un número ahí, pero la clave es el número.
  #2 (permalink)  
Antiguo 06/05/2011, 11:24
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 10 meses
Puntos: 88
Respuesta: Clave numérica en objeto?

Los nombres de variables siguen las mismas reglas que otras etiquetas en PHP. Un nombre de variable válido tiene que empezar con una letra o un carácter de subrayado (underscore), seguido de cualquier número de letras, números y caracteres de subrayado.
Código PHP:
Ver original
  1. $arr = array ('_100' => 'cien','_200' => 'doscientos');
  2. $p = (object) $arr;
  3. echo $p->_100;
saludos
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
  #3 (permalink)  
Antiguo 06/05/2011, 11:31
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Clave numérica en objeto?

Fino.

Después de exhaustivas pruebas de un par de minutos tampoco doy con el clavo.

Lo curioso es el resultado de var_dump()
Cita:
object(stdClass)#1 (2) { [100]=> string(4) "cien" [200]=> string(10) "doscientos" }
Y definitivamente resulta imposible leer dichas propiedades, o al menos ninguno de los dos lo ha conseguido hasta ahora.

Creo que la solución mas primitiva sería reconvertir el objeto en array para poder obtener dichos índices. Es lo único que puedo pensar.

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 06/05/2011, 11:33
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Clave numérica en objeto?

Gracias eits. Es que la clave es 100, no puede ser _100.

Alguna solución debe existir que acepte la clave tal cual.
  #5 (permalink)  
Antiguo 06/05/2011, 11:35
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Clave numérica en objeto?

pateketrueke, también estuve viendo ese var_dump anoche y no lo supe interpretar jejeje. El signo "#" y el "(2)" me dejaron loco.
  #6 (permalink)  
Antiguo 06/05/2011, 11:39
Avatar de eits  
Fecha de Ingreso: junio-2005
Ubicación: valladolid, yucatán
Mensajes: 1.655
Antigüedad: 18 años, 10 meses
Puntos: 88
Respuesta: Clave numérica en objeto?

Cita:
Iniciado por metacortex Ver Mensaje
Alguna solución debe existir que acepte la clave tal cual.
lo dudo, ya que el indice se convierte en una propiedad(variable) y el valor del array se asigna como valor a esa propiedad y pues, ya sabes que pasa.

sin embargo, investigaré un poco mas a ver que resulta.

saludos.
__________________
El amor es la locura mas lucida que tiene el hombre.- Andres Henestrosa
la tristeza no existe, solo es... la ausencia de la felicidad.
  #7 (permalink)  
Antiguo 06/05/2011, 11:42
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Clave numérica en objeto?

Por caso extremo entiendo tu ejemplo @metacortex, ¿en que situaciones es posible recibir o querer hacer eso?

En dicho extremo lo de menos es reconvertir el objeto en arreglo, y punto.

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 06/05/2011, 11:49
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Clave numérica en objeto?

Porque razón lo quieres tratar como objeto ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 06/05/2011, 12:31
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Clave numérica en objeto?

Hay un motivo pero la explicación es larga.

Actualmente enfrento un hecho poco usual: estoy reescribiendo un plugin de WordPress y aumentando sus funciones, de manera que el programador que lo use obtenga una serie de recursos para generar funciones derivadas. Para ello decidí seguir el consejo de Abimael: convertir las actuales funciones en una sola clase. Pero ya ustedes saben que en el presente estoy raspao con POO. Eso me ha limitado mucho, y ha ocasionado que la nueva versión tarde en liberarse. Estoy avanzando con el tema pero creo que me tomará todo este año y parte del siguiente dominarlo a cabalidad, pero el plugin debe salir más temprano, pues las nuevas versiones de WP lo están dejando atrás.

Sin embargo, el forzado "(object)" me permite darle al usuario la opción de utilizar el método $array->clave (que es el que se empleará cuando por fin el código se oriente a objetos) y con ello evitar que en un futuro deban desbaratar todo su trabajo secundario para adaptarse al nuevo método.

Porque si dejo las cosas como están y pongo al usuario a escribir $array['clave'] me veré en la necesidad de adjuntar funciones tipo "legacy" para impedir que el sitio se les venga abajo una vez hayan actualizado (y en consecuencia todos se acuerden de la que me parió). Un archivo "deprecated.php" del cual no voy a poder salir jamás en la vida.

Tal como lo estoy viendo desde aquí, el uso de $array->clave me basta para construir la mini-api que tengo planeada y que ocasione el menor impacto a futuro.

Y una de esas funciones demanda algo como lo expuesto arriba.

De todas formas, si a alguien se le ocurre una idea alterna para salir de este paso, bienvenida sea. Como información adicional Este tópico también está relacionado con el proyecto y aquí pueden visualizar el archivo en el trac de WordPress.
  #10 (permalink)  
Antiguo 06/05/2011, 12:40
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Clave numérica en objeto?

Te comento que ese es uno de los problemas fundamentales de haber combinado dos conceptos distintos en los arrays de php: los arrays tal cual (indexados), y los hashes (asociativos).

La API que desarrolles en caso de usar sintaxis OOP te sugiero lo hagas exclusivamente con valores no numéricos para las claves, entiendo tu situación, pero no entiendo la necesidad de usar claves numéricas para leer propiedades.

En ese sentido solo deberías replantear la verdadera necesidad de empelar dicha forma.

Si en un caso extremo continuas con tal necesidad puedes valerte de otras técnicas:
Código PHP:
$foo = (object) array(
  
'numeros' => array(100 => 'cien''etc...')
);

echo 
$foo->numeros[100]; // cien 
¿Que opinas?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 06/05/2011, 13:02
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Clave numérica en objeto?

Pues no está nada mal, gracias.

También te hice caso en lo de reconvertir el array y me puse a trabajar con la propuesta de eits:

Código PHP:
Ver original
  1. $arr = array (
  2.     '100' => 'cien',
  3.     '200' => 'doscientos'
  4. );
  5.  
  6. foreach ($arr as $k => $v)
  7.     $arr_2['_'. $k] = $v;
  8. unset($arr);
  9.  
  10. $p = (object) $arr_2;
  11.  
  12. echo $p->_100;
  #12 (permalink)  
Antiguo 06/05/2011, 13:15
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Clave numérica en objeto?

Gracias por la explicación metacortex, y la verdad que muchas opciones no tenes es una limitación del lenguaje.
No veo el sentido de convertirlo, si posteriormente va a ser una clase, la clave no puede ser un valor numérico, no seria mejor solución cambiar las claves numéricas directamente ?, o el cambio seria muy grande ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #13 (permalink)  
Antiguo 06/05/2011, 13:31
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Clave numérica en objeto?

El número depende de las imágenes que tenga el usuario subidas y registradas en la BD. Pensaba trabajar con un array simple, pero viendo que no se puede -al menos sin alterarlo después-, también está la opción de asignar una clave desde el principio. Pero si te soy más franco aún, aquí entre nos, no tengo ni mamarra idea de lo que voy a hacer.
  #14 (permalink)  
Antiguo 06/05/2011, 15:51
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Clave numérica en objeto?

Pero una pregunta, ¿por que en vez de convertir un array a objeto, haces esto?
Código PHP:
Ver original
  1. <?php
  2. $boolForNewFormat = true;
  3.  
  4. if($boolForNewFormat){
  5.     class Foo
  6.     {
  7.         private $_array = array();
  8.  
  9.         public function __construct(array $array)
  10.         {
  11.             $this->_array = $array;
  12.         }
  13.  
  14.         public function bar($key)
  15.         {
  16.             return array_key_exists($key, $this->_array)
  17.                 ? $this->_array[$key]
  18.                 : null;
  19.         }
  20.     }
  21.  
  22.  
  23.     $arr = array (
  24.         '100' => 'cien',
  25.         '200' => 'doscientos'
  26.     );
  27.     $obj = new Foo($arr);
  28.     echo $obj->bar(100) . '<br />';
  29.     echo $obj->bar(200);
  30. }
  31. else{
  32. // Formato antiguo
  33. }
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 06/05/2011 a las 19:24 Razón: corrigiendo código...
  #15 (permalink)  
Antiguo 06/05/2011, 19:40
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Clave numérica en objeto?

Cita:
Iniciado por metacortex Ver Mensaje
El signo "#" y el "(2)" me dejaron loco.
No sé si quisiste mencionar otra cosa, pero esto:
Código PHP:
Ver original
  1. object(stdClass)#1 (2)
lo que indica el #1 es que es el primer objeto que se menciona. Si hicieras esto
Código PHP:
Ver original
  1. $a = (object)$arr;
  2. var_dump($a); //object(stdClass)#1
  3.  
  4. echo '<br />';
  5. $b = (object)$arr;
  6. var_dump($b); //object(stdClass)#2
  7.  
  8. echo '<br />';
  9. $c = (object)$arr;
  10. var_dump($c); //object(stdClass)#3
  11.  
  12. echo '<br />';
  13. $d = (object)$arr;
  14. var_dump($d); //object(stdClass)#4
Vez como indica a que objeto está haciendo referencia. El (2) lo que hace referencia es a los diferentes valores que están en el objeto, en tu caso solo tienes dos valores. Bueno si no era una pregunta, pues al parecer no te entendí
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #16 (permalink)  
Antiguo 07/05/2011, 02:13
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Clave numérica en objeto?

Cita:
Iniciado por abimaelrc Ver Mensaje
Pero una pregunta, ¿por que en vez de convertir un array a objeto, haces esto?
Cita:
Iniciado por metacortex Ver Mensaje
Pero ya ustedes saben que en el presente estoy raspao con POO.
Cita:
Iniciado por abimaelrc Ver Mensaje
Vez como indica a que objeto está haciendo referencia. El (2) lo que hace referencia es a los diferentes valores que están en el objeto, en tu caso solo tienes dos valores. Bueno si no era una pregunta, pues al parecer no te entendí
Entendiste bien. A este nivel mis dudas aún son muy elementales (cuando sea grande ya verás )
  #17 (permalink)  
Antiguo 07/05/2011, 05:34
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Clave numérica en objeto?

Yo lo sigo sin ver, no me parece buena idea mezclar conceptos y menos si no estas claro en OOP, te sugiero que si tenes urgencia de actualizar el plugin, sigas la misma filosofia que ya tiene, que en paralelo desarrolles la versión 100% OOP, y cuando esta versión este completa y testada hacer el cambio.

Y bueno, de más esta decir que en el foro de OOP, siempre estamos listos para dar una mano.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #18 (permalink)  
Antiguo 07/05/2011, 20:17
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Clave numérica en objeto?

Es que claro estoy compadre (que temporalmente no sepa cómo hacerlo es otra cosa).

Tampoco entendí lo de mezclar conceptos ¿qué se está mezclando?.
  #19 (permalink)  
Antiguo 07/05/2011, 20:35
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Clave numérica en objeto?

que tal gente! el tema me llamo la atencion porque por ejemplo en javascript es posible. pero obvio, estamos hablando de php. ahora bien, una observacion que me resulta curiosa. si se hace un print_r o var_dump del array convertido a objeto, la inspeccion muestra que la clave numerica existe en el objeto. pero curiosamente si usamos la funcion get_object_vars para obtener las propiedades, el array devuelto no enumera las claves (en este caso propiedades) numericas. por tanto se entiende que no hay forma de accesar a ella mientras sea un objeto. pese a lo discutido y afirmado, al igual que @metacortex, tambien tengo la esperanza de que debe haber alguna forma (aunque sea tonto pensarlo asi).

__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #20 (permalink)  
Antiguo 07/05/2011, 20:38
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Clave numérica en objeto?

Lo de mezclar conceptos, se refiere a usar PHP por procedimiento y a la vez OOP. Debería ser uno o el otro.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #21 (permalink)  
Antiguo 07/05/2011, 20:45
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Clave numérica en objeto?

Ok ya comprendo. Es que lo expliqué más arriba (no los culpo, el post salió largo). Intento establecer un método de uso de mi función por parte de terceros, que posteriormente no cambie. Sólo eso.
  #22 (permalink)  
Antiguo 07/05/2011, 20:48
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Clave numérica en objeto?

@zerokilled, bueno una forma de hacerlo es como mostré, puede que alguien me sorprenda, como siempre lo hacen, pero crear una variable en php como numérica "no es posible normalmente". Lo escribo entre comillas porque se puede lograr haciendo algo así
Código PHP:
Ver original
  1. <?php
  2. ${100} = 'foo';
  3. echo ${100};
Pero en las propiedades no es posible, hacer esto
Código PHP:
Ver original
  1. <?php
  2. class Foo
  3. {
  4.     private ${100};
  5. }
  6. $obj = new Foo;
Te trae un error similar a
Cita:
Parse error: syntax error, unexpected '$', expecting T_VARIABLE in ... on line 4
Por lo que, mejor es preparar un setter que ingrese el valor del array y luego con otro método trabajar el array.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #23 (permalink)  
Antiguo 07/05/2011, 20:54
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Clave numérica en objeto?

@meta, el ejemplo que te di, puede servirte para lo que quieres hacer, ya que lo único que necesitas es ingresar en alguna propiedad los valores que quieres usar y luego en todos los demás métodos solo tienes que modificar o añadir o eliminar.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #24 (permalink)  
Antiguo 07/05/2011, 21:29
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Clave numérica en objeto?

admito que aun soy noob en php, espero que de aqui no me saquen a patada. estaba buscando por la web si habia forma de como acceder y me encuentro con este reporte http://bugs.php.net/bug.php?id=52717. resulta que puedes hacer lo siguiente:
Código PHP:
$bar = new stdClass;
$bar->{100} = 'cien';
echo 
$bar->{100}; 
lo que me resulta extraño es que en una clase no puede definir una propiedad como numerica (tal como demostro abimael), sin embargo, si puedes hacerlo directamente al objeto. me parece a mi que de la misma forma que una clase no lo permite, el casting al objeto aplica la misma limitacion. en fin, como solucion lo que se me ocurre es algo como lo siguiente.
Código PHP:
$arr = array (
    
'100' => 'cien',
    
'200' => 'doscientos'
);

$obj = new stdClass();
foreach(
$arr as $k => $v$obj->$k $v
pd: abimael, gracias por la explicacion.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #25 (permalink)  
Antiguo 07/05/2011, 21:49
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Clave numérica en objeto?

Interesante. Pero aún creo que para que sea OOP debería usarse un setter/getter. Pero con eso vemos que no se limita aún OOP usando $obj->{100}
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #26 (permalink)  
Antiguo 08/05/2011, 04:59
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Clave numérica en objeto?

@zerokilled, no se puede hacer de esa forma sobre cualquier objeto, se puede sobre una instancia de stdClass ya que no se puede definir una propiedad numérica en una clase, para hacerlo sobre cualquier objeto hay que hacerlo con un array como propiedad(como en el ejemplo de abimael) + la magia de PHP, algo así:

Código PHP:
Ver original
  1. class Property
  2. {
  3.     protected $_data = array(
  4.         100 => '',
  5.         200 => ''
  6.     );
  7.  
  8.     public function __get($key)
  9.     {
  10.         if(!array_key_exists($key, $this->_data)) {
  11.             throw new OutOfBoundsException();
  12.         }
  13.         return $this->_data[$key];
  14.     }
  15.  
  16.     public function __set($key, $val)
  17.     {
  18.         if(!array_key_exists($key, $this->_data)) {
  19.             throw new OutOfBoundsException();
  20.         }
  21.         $this->_data[$key] = $val;
  22.     }
  23. }
  24.  
  25. $p = new Property();
  26. $p->{100} = '100';
  27. $p->{200} = '200';
  28.  
  29. echo  $p->{100} . PHP_EOL;
  30. echo  $p->{200} . PHP_EOL;

Pero con esto y todo sigue estando mal, el nombre de una propiedad debería estar relacionado con su objetivo y ciertamente 001, 100, 101 o algo parecido no dice nada, que se pueda hacer con workarounds, si, ahora que sea una buena idea, no lo creo.
Lo que comento eints al inicio del thread no es algo que se alla inventado, esta en el manual, este tipo de cosas habría que evitarlas.

@metacortex, el array que representa ? la colección de imágenes o a una imagen ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #27 (permalink)  
Antiguo 08/05/2011, 09:01
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Clave numérica en objeto?

La colección de todas las imágenes que el usuario tiene en su sitio.
  #28 (permalink)  
Antiguo 08/05/2011, 11:41
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Clave numérica en objeto?

Una idea de lo que puedes hacer de aquí en adelante con tu plugin
Código PHP:
Ver original
  1. <?php
  2. class Property
  3. {
  4.     protected $_data = array();
  5.  
  6.     public function __get($key)
  7.     {
  8.         if(!array_key_exists($key, $this->_data)) {
  9.             throw new OutOfBoundsException();
  10.         }
  11.         return $this->_data[$key];
  12.     }
  13.  
  14.     public function __set($key, $val)
  15.     {
  16.         /**
  17.          * Si no deseas que sobre-escriba los datos
  18.          *
  19.          * if(!array_key_exists($key, $val)){
  20.          *  $this->_data[$key] = $val;
  21.          * }
  22.          */
  23.         $this->_data[$key] = $val;
  24.     }
  25. }
  26.  
  27. class Foo extends Property
  28. {
  29.     public function bar()
  30.     {
  31.         return $this->_data;
  32.     }
  33.  
  34.     public function wpsi_options_page()
  35.     {
  36.         add_options_page(__('WP Smart Image II', 'wp-smart-image'), __('WP Smart Image II', 'wp-smart-image'), 8, 'wp-smart-image-ii', 'wpsi_options');
  37.     }
  38.  
  39.     //...
  40. }
  41.  
  42. $f = new Foo();
  43. $f->{100} = '100';
  44. $f->{200} = '200';
  45. $f->{300} = '300';
  46. $f->{300} = 'trecientos'; //sobre-escribe el anterior
  47.  
  48. echo $f->{100} . PHP_EOL;
  49. echo $f->{200} . PHP_EOL;
  50. echo $f->{300} . PHP_EOL;
  51.  
  52. //o
  53. print_r($f->bar());
  54.  
  55. add_action('admin_menu', array($f, 'wpsi_options_page'));
  56. //...
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #29 (permalink)  
Antiguo 08/05/2011, 13:47
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Clave numérica en objeto?

@metacortex, si es una colección, segui tratándolo como un array, y cuando desarrolles la clase "collection" le das soporte para acceder como array a través de ArrayAccess, podes hacer esto:

Código PHP:
Ver original
  1. //como array
  2. print_r($collection[101]);
  3.  
  4. //como objeto
  5. print_r($collection->get(101));

Una implementacion muy simple:

Item, clase básica para guardar en la colección, en tu caso seria Image o algo parecido.
Código PHP:
Ver original
  1. class Item
  2. {
  3.     /**
  4.      * @var string|integer
  5.      */
  6.     protected $_id;
  7.  
  8.     /**
  9.      * @var string
  10.      */
  11.     protected $_name;
  12.  
  13.     /**
  14.      * @param string|integer $id
  15.      * @param string $name
  16.      */
  17.     public function __construct($id, $name)
  18.     {
  19.         $this->_id   = (int)$id;
  20.         $this->_name = (string)$name;
  21.     }
  22.  
  23.     /**
  24.      * @return string|integer $_id
  25.      */
  26.     public function getId()
  27.     {
  28.         return $this->_id;
  29.     }
  30.  
  31.     /**
  32.      * @param string $_name
  33.      * @return Item provide fluent interface
  34.      */
  35.     public function setName($name)
  36.     {
  37.         $this->_name = (string)$name;
  38.         return $this;
  39.     }
  40.  
  41.     /**
  42.      * @return string $_name
  43.      */
  44.     public function getName()
  45.     {
  46.         return $this->_name;
  47.     }
  48.  
  49.     public function __toString()
  50.     {
  51.         return (string)$this->_id;
  52.     }
  53. }

Collection, esta clase deberia implementar Iteraror, SeekableIterator, ArrayAccess y Countable, pero para simplificar, en ejemplo utilizo IteratorAggregate.
Código PHP:
Ver original
  1. class Collection implements IteratorAggregate
  2. {
  3.     /**
  4.      * @var array
  5.      */
  6.     protected $_data = array();
  7.  
  8.     /**
  9.      * Implements IteratorAggregate
  10.      * @return ArrayIterator
  11.      */
  12.     public function getIterator()
  13.     {
  14.         return new ArrayIterator($this->_data);
  15.     }
  16.  
  17. }
  18.  
  19. class ItemCollection extends Collection
  20. {
  21.     /**
  22.      * @param Item $i
  23.      * @return Collection provide fluent interface
  24.      */
  25.     public function add(Item $i)
  26.     {
  27.         $this->_data[(string)$i] = $i;
  28.         return $this;
  29.     }
  30. }

Test:

Código PHP:
Ver original
  1. $collection = new ItemCollection();
  2. $i1 = new Item(101, 'Item 1');
  3. $i2 = new Item(201, 'Item 2');
  4.  
  5. $collection->add($i1)
  6.            ->add($i2);
  7.  
  8. $it = $collection->getIterator();
  9.  
  10. assert(count($it) === 2); //pass
  11. assert($it->offsetGet(101) === $it[101]); //pass
  12. assert($it->offsetGet(101) === $it[201]); //fail
  13.  
  14. foreach($it as $item){
  15.     echo $item->getId() . ' - ' . $item->getName() . PHP_EOL;
  16. }

Es algo sencillo de conseguir y te permite acceder a los elementos de la colleción de las dos formas como objeto o como array.

@abimaelrc, hay que tener cuidado con esa forma de implementar __set, porque tiene un efecto poco deseable, podes setear cualquier cosa, es como si las propiedades fueran públicas, por eso se setean en el array las keys y se comprueba que existan.


Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #30 (permalink)  
Antiguo 08/05/2011, 16:06
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Clave numérica en objeto?

Si estoy conciente de que puede tener muchos fallos. Gracias por el dato nuevamente Bueno a aprender como trabajar con todo lo que has indicado
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Etiquetas: clave, objeto
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

SíEste tema le ha gustado a 3 personas




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