2009-09-22 12 views
82

Estoy usando un motor de plantillas que inserta código en mi sitio donde lo quiero.Arreglo de acceso devuelto por una función en php

escribí una función para probar algo que es bastante fácil:

myfunction() { return '($this->data["a"]["b"] ? true : false)'; } 

El problema es, $ this-> datos son privados y no puede acceder a ella por todas partes, así que tengo que usar obtener datos(); que causa mi problema

$this->getData()['a']['b'] 

no funciona, y asignar el valor primero no lo hace, ya sea porque va a ser utilizado directamente en un bloque if().

¿Alguna idea?

+0

La asignación del valor de retorno definitivamente funciona y es la única forma. ¿Puede mostrarnos su código que no funciona? –

+0

Bueno, no funciona porque el código se insertará en un código if (/ * aquí * /). Entonces no puedo simplemente asignar los datos antes. – enyo

+1

¿Qué demonios estás construyendo de todos modos? :) algo con eval? –

Respuesta

123

Desde PHP 5.4 es posible hacer exactamente eso:

getSomeArray()[2] 

Referencia: https://secure.php.net/manual/en/language.types.array.php#example-62

En PHP 5.3 o anterior, tendrá que utilizar una variable temporal.

+4

Tengo 'PHP 5.4.11-1 ~ precise + 1' y esta característica no funciona. Recibí el mensaje en respuesta 'Error de análisis: error de sintaxis, inesperado '[' ' – Eugene

+1

+ Eugene ¿Lo hiciste funcionar? Quizás otros experimenten el mismo problema. – enyo

+0

Esto es increíble ... me encantó este truco ... gracias – floCoder

16

No se puede usar algo como esto:

$this->getData()['a']['b'] 

es decir, la sintaxis de matrices de acceso no es posible directamente en una función llamada.

youy tiene que utilizar un poco de variable temporal, así:

$tmp = $this->getData(); 
$tmp['a']['b'] // use $tmp, now 

En su caso, esto probablemente significa usar algo como esto:

function myfunction() { 
    $tmp = $this->getData(); 
    return ($tmp['a']['b'] ? true : false); 
} 

Tienes que:

  • primero, llame a su método getData() y almacene su re convertir en un valor temporal varibale
  • a continuación, utilizar esa variable temporal para su prueba

Usted no tiene mucha elección acerca de que, en realidad ...

+0

Bueno, como dije, mi problema es que este código se inserta, directamente en si (/ * el código va aquí * /) por lo que definir una función allí no es realmente posible ... – enyo

+0

¿No se puede asignar el resultado del método? llamar a una variable antes de la instrucción if, y usar esa variable en la instrucción if, en lugar de intentar llamar directamente al método desde la instrucción if. –

+1

Lamentablemente, no ... Este es un motor de plantillas, y no tengo control sobre él. – enyo

1

$this->data es siempre accesible, si está protegido. $object->data no se puede acceder desde cualquier lugar, por lo que si devuelve $this en su código, y se evalúa como tal, debería estar bien.

Por cierto, hay un error en su código: las citas deben ser escapadas.

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; } 
+0

Sí, lo siento ... Corregí mi publicación: $ this-> data is private por supuesto. También corrigió mi error al crear el error. – enyo

12

Ok ... al parecer, realmente no hay una mejor manera, así que voy a responder a mí mismo con una solución no tan hermosa:

creé la función:

arrayGet($array, $index) { return $array[$index]; } 

y lo utilizó como esto:

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' } 

esto no es bonita, pero funciona.

1

Es posible desde PHP versión 5.4.

Si no desea que una variable temporal para que y su versión de PHP es menor, de 5,4, que todavía se puede utilizar algunos construido en funciones para obtener el primer o el último elemento:

$x  = 'first?last'; 
$first = array_shift(explode('?', $x)); 
$last = end(explode('?', $x)); 
$last2 = array_pop(explode('?', $x)); 

Editar: !!! Tenga en cuenta que en versiones posteriores (5.4+) PHP enviará un aviso, porque el final solo espera variables como parámetro.

Cuestiones relacionadas