我是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 ?>
我知道$this
是class
的自我,它只在类中用来引用方法或属性,在上面的代码中,没有定义类,为什么呢可以直接使用$ this关键字吗? $this->__('Home')
代表什么?
答案 0 :(得分:5)
由于您标记了此magento,因此您可能拥有类似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_Template
类fetchView()
方法中。您可以转到app/code/core/Mage/Core/Block/Template.php
,看看它是如何完成的。这就是为$this
提供.phtml
的原因。您可以在this Alan Storm's article中阅读有关magento块和模板的更多信息。它有点过时,但基本的解释很好(imho)。