栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

我可以在PHP类中包含代码吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

我可以在PHP类中包含代码吗?

不可以。您不能在类主体中包含文件。
在定义类的文件中,您只能在 方法主体中类主体外部 包括文件。

根据您的描述,我认为您需要这样做:

<?php // MyClass.phpclass MyClass{    protected $_prop;    include 'myclass-methods.php';}<?php // myclass-methods.phppublic function myMethod(){   $this->$_prop = 1;}

运行此代码将导致

Parse error: syntax error, unexpected T_INCLUDE, expecting T_FUNCTION

这是可能的

<?php // MyClass.phpclass MyClass{    protected $_prop;    public function __construct() // or any other method    {        include 'some-functions.php';        foo($b); // echoes 'a';    }}<?php // some-functions.php$b = 'a';function foo($str){   echo $str;}

这样,会将包含文件的内容导入方法范围,而不是类范围。您可以在包含文件中包括函数和变量,但不能包括方法。您 也可以但不应该
将整个脚本放入其中并更改方法的作用,例如

<?php // MyClass.php    // ...    public function __construct($someCondition)    {        // No No Code here        include ($someCondition === 'whatever') ? 'whatever.php' : 'default.php';    }    // ...<?php // whatever.php    echo 'whatever';<?php // default.php    echo 'foo';

但是,用这种方式修补类以表现出不同的行为并不是您在OOP中应该做的。这完全是错误的,应该使您的眼睛流血。

由于要动态更改行为,因此扩展类也不是一个好选择(请参见下面的原因)。您真正想要做的是编写一个接口,并使您的类使用实现此接口的对象,从而确保可以使用适当的方法。这称为策略模式,其工作方式如下:

<?php // Meowing.php interface Meowing{    public function meow();}

现在,您获得了所有喵喵行为都必须遵守的合同,即拥有喵喵方法。接下来定义喵叫行为:

<?php // RegularMeow.phpclass RegularMeow implements Meowing{    public function meow()    {        return 'meow';    }}

现在使用它,使用:

<?php // Cat.phpclass Cat{    protected $_meowing;    public function setMeowing(Meowing $meowing)    {        $this->_meowing = $meowing;    }    public function meow()    {        $this->_meowing->meow()    }}

通过将MeowingTypeHint添加到setMeowing,可以确保所传递的参数实现了Meowing接口。让我们定义另一个喵叫行为:

<?php // LolkatMeow.phpclass LolkatMeow implements Meowing{    public function meow()    {        return 'lolz xD';    }}

现在,您可以轻松地交换如下行为:

<?phprequire_once 'Meowing.php';require_once 'RegularMeow.php';require_once 'LolkatMeow.php';require_once 'Cat.php';$cat = new Cat;$cat->setMeowing(new RegularMeow);echo $cat->meow; // outputs 'meow';// now to change the behavior$cat->setMeowing(new LolkatMeow);echo $cat->meow; // outputs 'lolz xD';

通过定义抽象的baseCat和meow方法,然后从中派生具体的RegularCat和Lolkat类,您也可以通过继承解决上述问题,但是您必须考虑要实现的目标。如果您的猫永远不会改变它们的喵叫方式,请继续使用继承,但是如果您的RegularCat和Lolkat应该能够发出任意叫声,请使用“策略”模式。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/452140.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号