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?
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".
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:
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()
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?
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.