En Magento 2, la $thisvariable ya no hace referencia al objeto de bloque de una plantilla. Se refiere a una clase de plantilla.
Magento\Framework\View\TemplateEngine\Php
Sin embargo, esta clase de plantilla tiene un __callmétodo passthrough
#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
return call_user_func_array([$this->_currentBlock, $method], $args);
}
Lo que garantiza que cualquier llamada a un método llegue al bloque real. Esto también explica por qué no puede llamar a métodos protegidos desde phtmlplantillas.
Sin embargo, además de esto, cada plantilla (¿creo?) Tiene una variable denominada $blockpoblada, que también se refiere al objeto de bloque principal. Puede ver esto en uso en la plantilla de lista de Magento
#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();
donde $blockse usa la variable, pero nunca se define explícitamente.
Aparte de las diferencias mencionadas anteriormente, ¿hay alguna diferencia entre usar una técnica sobre la otra? es decir, ¿ambas cosas $blocky se $this->currentBlockrefieren al mismo objeto?

$blockHasta donde he visto, ambos son casi iguales en PHP TemplateEngineInterface, pero recuerde que en Magento2 puede crear motores de plantillas personalizados. No como Magento1 en el que acaba de tener archivos phtml.
Si ve el
TemplateEngineInterfaceno puede ver ninguna referencia a ningún método que llame alcurrentBlock, por lo que creo que el$this->currentBlockenfoque es específico de la plantilla de PHP.Pero para ser independiente del motor de plantillas,
$blockdebe ser el enfoque correcto.Quiero decir que, desde el punto de vista teórico, podría crear un motor basado en PHP diferente que no pudiera confiar en archivos phtml, pero tal vez en alguna otra estructura PHP.
Supongo que
$blockes la forma "correcta" para el modo "phtml" porque se pasa explícitamente como variable de contexto.$blocky$this->currentBlockson lo mismo desde un punto de vista técnico, pero si se usaran explícitamente$block, creo que deberíamos usarlo, desde el punto de vista del estilo de código.fuente