php可以包含什么代码,我可以在PHP类中包含代码吗?

小编典典

不可以。您不能在类主体中包含文件。

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

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

class MyClass

{

protected $_prop;

include 'myclass-methods.php';

}

public function myMethod()

{

$this->$_prop = 1;

}

运行此代码将导致

Parse error: syntax error, unexpected T_INCLUDE, expecting T_FUNCTION

这是可能的

class MyClass

{

protected $_prop;

public function __construct() // or any other method

{

include 'some-functions.php';

foo($b); // echoes 'a';

}

}

$b = 'a';

function foo($str)

{

echo $str;

}

这样,会将包含文件的内容导入方法范围,而不是类范围。您可以在包含文件中包括函数和变量,但不能包括方法。您 也可以但不应该

将整个脚本放入其中并更改方法的作用,例如

// ...

public function __construct($someCondition)

{

// No No Code here

include ($someCondition === 'whatever') ? 'whatever.php' : 'default.php';

}

// ...

echo 'whatever';

echo 'foo';

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

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

interface Meowing

{

public function meow();

}

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

class RegularMeow implements Meowing

{

public function meow()

{

return 'meow';

}

}

现在使用它,使用:

class Cat

{

protected $_meowing;

public function setMeowing(Meowing $meowing)

{

$this->_meowing = $meowing;

}

public function meow()

{

$this->_meowing->meow()

}

}

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

class LolkatMeow implements Meowing

{

public function meow()

{

return 'lolz xD';

}

}

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

require_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应该能够发出任意叫声,请使用“策略”模式。

2020-05-26

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值