Estoy usando un motor de plantillas que inserta código en mi sitio donde lo quiero.
Escribí una función para probar algo que es bastante fácil:
myfunction() { return '($this->data["a"]["b"] ? true : false)'; }
El problema es que $ this-> data es privado y no puedo acceder a ellos en todas partes, así que tengo que usar getData (); que causa mi problema.
$this->getData()['a']['b']
no funciona, y la asignación del valor primero tampoco porque se usará directamente en un bloque if ().
¿Algunas ideas?
myfunction()
procesa (fue) ese valor de cadena que devuelve ? Esa parte falta en tu pregunta.Respuestas:
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, necesitará usar una variable temporal.
fuente
PHP 5.4.11-1~precise+1
y esta característica no funciona! Recibí un mensaje en respuestaParse error: syntax error, unexpected '['
No puedes usar algo como esto:
$this->getData()['a']['b']
es decir, la sintaxis de acceso a matrices no es posible directamente en una llamada a función.
Tienes que usar alguna variable temporal , como esta:
$tmp = $this->getData(); $tmp['a']['b'] // use $tmp, now
En su caso, esto probablemente signifique usar algo como esto:
function myfunction() { $tmp = $this->getData(); return ($tmp['a']['b'] ? true : false); }
Tienes que :
getData()
método y almacene su valor de retorno en una variable temporalNo tienes muchas opciones al respecto, en realidad ...
fuente
Ok ... aparentemente no hay una mejor manera, así que voy a responderme con una solución no tan hermosa:
Creé la función:
arrayGet($array, $index) { return $array[$index]; }
Y lo usé así:
myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }
Esto no es bonito pero funciona.
fuente
$this
->data
siempre es accesible, si está protegido. no es accesible desde todas partes, por lo que si regresa en su código y se evalúa como tal, debería estar bien.$object
->data
$this
Por cierto, hay un error en su código: las comillas deben escaparse.
myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }
fuente
Es posible a partir de la versión 5.4 de PHP.
Si no desea una variable temporal para eso y su versión de PHP es menor, que 5.4 , aún puede usar algunas funciones integradas 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 lanzará un aviso, porque end solo espera variables como parámetro.
fuente