我正在阅读一篇关于PHP 5.4.0中的新功能的文章.最令人期待的一个是特质.
阅读这些特征,看看它们的全部内容,它们只是看起来像编译器辅助的复制粘贴给我; 和一种语言提供了使用组合的方式,非常类似于众所周知的战略模式中使用的,它利用了"有利于构成而不是继承"的设计原则.
我理解正确吗?
这些特性可以提供哪些其他优势,这使得它们有价值而不仅仅是使用构图设计原则?
我确信我们都遇到了这样一种情况:你有一个块或模型的多个扩展,它们重写了相同的核心块/模型.我遇到的问题是: 你如何控制Magento看到这些类的顺序?
例如,假设我们有2个扩展,包含以下2个类:
config.xml中
<catalog>
<rewrite>
<product_view>My_ClassA_Block_Catalog_Product_View</product_view>
</rewrite>
</catalog>
Run Code Online (Sandbox Code Playgroud)
我/ ClassA的/座/目录/产品/ View.php
class My_ClassA_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
Run Code Online (Sandbox Code Playgroud)
<catalog>
<rewrite>
<product_view>My_ClassB_Block_Catalog_Product_View</product_view>
</rewrite>
</catalog>
Run Code Online (Sandbox Code Playgroud)
我/ ClassB的/座/目录/产品/ View.php
class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
Run Code Online (Sandbox Code Playgroud)
推荐的解决方案是改变它们中的一个,以便它们延伸的其他和它们连起来(class A extends B {},class B extends C {}等):
我/ ClassA的/座/目录/产品/ View.php
class My_ClassA_Block_Catalog_Product_View extends My_ClassB_Block_Catalog_Product_View {}
Run Code Online (Sandbox Code Playgroud)
我/ ClassB的/座/目录/产品/ View.php
class My_ClassB_Block_Catalog_Product_View extends Mage_Catalog_Block_Product_View {}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是Magento不一定会这样看.我不知道它是按字母顺序排列还是有点随机,但有时这种方法有效,有时则不然.在某些情况下,Magento优先使用ClassB和所有调用来createBlock('catalog/product_view')创建ClassB实例,完全绕过ClassA中的任何代码.
所以我的问题是:createBlock('catalog/product_view')当两个不同的扩展都重写核心catalog_product_view类时,如何控制哪个类被实例化?
我的PHP应用程序通常使用命名空间类.这些类中的方法定义为static.
现在PHP已经引入了Traits,我正试图解决何时使用它们的问题.我看到了一些使用traits的例子,但我认为这可以通过静态类方法轻松实现.
这里列出了一个使用记录器的相当全面的例子:PHP中的特征 - 任何现实世界的例子/最佳实践?
但是为什么要使用Trait,如果你也可以使用静态Logger :: log()?我现在唯一能想到的就是轻松访问$ this.我现在面临的另一个例子是用户存在的功能.特质吧,还是静态方法呢?
任何人都可以对此有所了解吗?
在什么样的情况下,人们会在PHP中使用Traits?我对此有一个非常好的总体想法,但我似乎无法想到在我编写的应用程序中使用它们的方法,但这可能是因为它当时不需要特征.
一种情况我已经意识到需要特征:
基本上可以在类之间共享但可能在多个类层次结构中传播的功能应该使用特征.还有哪些场景可以利用Traits而不是事件系统?
在php中,特征具有接口和抽象类等特性,特征也有助于继承。任何有关Trait,Interface,Abstract类和Interface的现实示例或讨论。
该schmittjoh/CG-库看来我需要什么,但没有文件可言.
该库提供了生成PHP代码通常需要的一些工具.其中一个优势在于通过行为增强现有类.
鉴于A课程:
class A {}
Run Code Online (Sandbox Code Playgroud)
我想在运行时和一些缓存机制上修改类A,使其实现给定的接口:
interface I
{
public function mustImplement();
}
Run Code Online (Sandbox Code Playgroud)
......与方法"默认"的实现mustImplement()在A类.