$This-> Vs Yii:app()->

Buenas,

he visto, de momento, que tanto como con Yii:app y $this puedo ejecutar los mismos métodos, y me pregunto que es más óptimo, pero no he sabido encontrar ninguna documentación sobre esto y veo que en muchos códigos se usa indistintamente, alguien me sabría explicar cual es mas óptimo para el uso en Yii?

Saludos y gracias.

Hola Hiei,

La diferencia es grande :)

Los métodos llamados desde $this, normalmente son de ámbito local, mientras que los de Yii::app() son a nivel global de la aplicación.

Por poner un ejemplo, la función createUrl()

Para el caso de $this, la función asume que todas las URLs pertenecen al controlador, así que si hago un createUrl(‘index’) y el controlador se llama “Cont”, entonces se convierte en “index.php?r=/cont/index”.

Pero en el caso de Yii::app(), se asume la aplicación como raíz, así que para la función se renderizaría como: "?r=/index"…

En otras palabras, en el primer caso, se asume que se está llamando una "action" del mismo "controller", pero el segundo caso, se asume que es un "controller".

Espero haber contestado la pregunta :)

Hola Ricardo,

gracias por tu respuesta, según tu explicación yo entiendo que entonces es mejor usar $this, pero he hecho una prueba y he obtenido unos resultados que me desconciertan un poco.

he hecho 2 vistas en el mismo controlar con la prueba siguiente:




<?php

    echo "<h1>".memory_get_usage()."</h1>\n";

?>

<?php echo Yii::app()->createUrl('controlador/index') ?>

<?php

    echo "<h1>".memory_get_usage()."</h1>\n";

?>



y en otra vista:




<?php

    echo "<h1>".memory_get_usage()."</h1>\n";

?>

<?php echo $this->createUrl('controlador/index') ?>

<?php

    echo "<h1>".memory_get_usage()."</h1>\n";

?>



y los resultados de uso de memoria han sido estos:

con this

2567744

2569856

diferencia:

-2112

con Yii:app

2568616

2570520

diferencia:

-1904

con this

2568248

2570360

diferencia:

-2112

con Yii:app

2568616

2570520

diferencia:

-1904

me desconcierta muchísimo que use más memoria para un $this que para un Yii:app(), estoy haciendo algo mal? alguna mala configuración del servidor? o al ser Yii:app un método estático acaba siendo más óptimo, en este caso?

Es normal, de hecho internamente el $this llama a Yii::app(), de ahí q siempre consuma más…, así que habrá ocasiones en que sea mejor usar $this y otras Yii::app()… cuando $this ofrezca la funcionalidad lista para usar, se usa esa… y cuando necesitamos la funcionalidad básica, entonces acudimos a Yii:app()

Saludos

pero que $this llame a Yii::app(), solo ocurre en la vista, no? en controladores y modelos, estará llamando solo a la propia class en la que se encuentra, no?

Eso depende del ámbito.

Si estoy en la vista o en el controlador: $this equivale al controlador activo. En este caso, casi siempre se hace un llamado interno a Yii::app(), aunque no siempre.

En los modelos y demás: equivale a la clase en la que esté la instrucción (que no es controlador). En este caso tendría que verificar exactamente qué atributos y métodos tiene la clase.

Muchas gracias, Ricardo, ahora lo tengo un poco más claro!

Con gusto, para eso está la comunidad ;)