为什么模板可以直接使用$ this关键字?

时间:2012-02-11 09:51:24

标签: php magento

我是PHP的新手;今天我在Magento top.phtml中看到了以下代码:

<?php $_menu = $this->renderCategoriesMenuHtml(0,'level-top') ?>
<?php if($_menu): ?>
<div class="nav-container">
    <ul id="nav">
        <!--NEW HOME LINK -->
        <li class="home"><a href="<?php echo $this->getUrl('') ?>"><?php echo $this->__('Home') ?></a>"</li>
        <!--NEW HOME LINK -->
        <?php echo $_menu ?>
    </ul>
</div>
<?php endif ?>

我知道$thisclass的自我,它只在类中用来引用方法或属性,在上面的代码中,没有定义类,为什么呢可以直接使用$ this关键字吗? $this->__('Home')代表什么?

3 个答案:

答案 0 :(得分:5)

由于您标记了此,因此您可能拥有类似Mage_Catalog_Block_Navigation的类。至少,这些方法暗示了这一点。现在,我对Magento一无所知,但这个课程从Mage_Core_Block_Template开始,在该课程中你有fetchView方法,which at some point does

include $includeFilePath;

当您在方法中include代码时,您可以在包含的文件代码中访问$this,因为它是在该实例的范围内进行评估的:

  

当包含文件时,它包含的代码将继承发生包含的行的变量范围。从那时起,调用文件中该行可用的任何变量都将在被调用文件中可用。但是,包含文件中定义的所有函数和类都具有全局范围。

一般例子:

class Template
…
    public function render($templateFile)
    {
        include $templateFile;
    }
    public function ___($stringToTranslate)
    {
        // translates $stringToTranslate somehow
    }
 }

请注意,“$this不是该类的self”只是部分正确。 self也是一个关键字和php,但self实际上是指类,$this指的是类的实例。

答案 1 :(得分:1)

对象已定义!此模板用作块的实例。这是模板中引用的实例。在模板中识别您当前正在处理的类的快速方法是在模板中使用以下代码行:

<?php echo get_class($this); ?>

另外,您提到了__方法。这与Magento的语言环境系统挂钩。这意味着你可以写:

<?php echo $this->__('Hello') ?>

在您的模板中,然后在法语商店中使用相同的模板文件,只需提供从英语到法语的文本映射,而不是创建一个全新的模板。

答案 2 :(得分:1)

因为它是某些块类的模板。阻止模板(.phtml文件)包含在Mage_Core_Block_TemplatefetchView()方法中。您可以转到app/code/core/Mage/Core/Block/Template.php,看看它是如何完成的。这就是为$this提供.phtml的原因。您可以在this Alan Storm's article中阅读有关magento块和模板的更多信息。它有点过时,但基本的解释很好(imho)。