不能。您不能在类主体中包含文件。
在定义类的文件中,您只能将文件包含在方法体中或类体外。
从你的描述我带你想要这个:
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;
}
这样做,将include文件的内容导入方法范围,而不是类范围。您可以在include文件中包括函数和变量,但不包括方法。你可以,但不应该把整个脚本,以及改变什么方法,例如。
// ...
public function __construct($someCondition)
{
// No No Code here
include ($someCondition === 'whatever') ? 'whatever.php' : 'default.php';
}
// ...
echo 'whatever';
echo 'foo';
然而,修补类这种方式来展现不同的行为不是你应该如何在OOP中做。这只是平淡的错误,应该让你的眼睛流血。
因为你想动态改变行为,扩展类也不是一个好的选择(见下面为什么)。你真正想要做的是写一个interface,让你的类使用实现这个接口的对象,从而确保适当的方法可用。这称为Strategy Pattern,工作如下:
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()
}
}
通过添加Meowing TypeHint到setMeowing,你确保传递的param实现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';
虽然你也可以解决上面的inheritance通过定义一个abstract BaseCat和喵方法,然后从中导出具体的RegularCat和Lolkat类,你必须考虑你想要实现的。如果你的猫永远不会改变他们喵的方式,继续使用继承,但如果你的RegularCat和Lolkat应该能够做任意的话,然后使用战略模式。
有关PHP中的更多design patterns,请查看以下资源: