【问题标题】:Why can a template use $this keyword directly?为什么模板可以直接使用 $this 关键字?
【发布时间】:2012-03-03 14:24:40
【问题描述】:

我是 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的self,它只是在类中用来引用方法或属性,在上面的代码中,并没有定义类,为什么可以使用$this直接关键词? $this-&gt;__('Home') 代表什么?

【问题讨论】:

  • __('Home') 可能是文本“Home”的本地化方法,用于轻松将页面转换为各种语言。
  • 请参阅 svn.magentocommerce.com/source/branches/1.6/app/code/core/Mage/… ,函数 __() 作为 Magento 翻译系统的入口点。有关其他资源,请参阅 magento.com 上 Alan Storm 的知识库文章,当您准备好后,您可能会喜欢 Magento U 提供的免费基础视频(完全披露:我是视频中的人)。祝你好运,继续提问!

标签: php magento


【解决方案1】:

既然你标记了这个,你可能有一个像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 指的是类的实例。

【讨论】:

  • 模板包含在扩展 Mage_Core_Block_Template 的块中。它的继承链中没有助手。
  • @clockworkgeek 谢谢。但是,我不在乎 Magento 部分。我上面给出的示例模板根本与 Magento 无关。更新了答案以使其更加清晰。
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    因为它是某些块类的模板。块模板(.phtml 文件)包含在 Mage_Core_Block_TemplatefetchView() 方法中。你可以去app/code/core/Mage/Core/Block/Template.php看看它是怎么做的。这就是$this.phtml 中可用的原因。您可以在this Alan Storm's article 中阅读有关 magento 块和模板的更多信息。它有点过时,但基本解释得很好(恕我直言)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-24
      • 2015-10-31
      • 2013-01-17
      • 1970-01-01
      • 2010-09-06
      • 2019-10-10
      相关资源
      最近更新 更多