没有。您不能在类正文中包含文件。
在定义类的文件中,您只能将文件包含在方法主体或类主体之外。
根据你的描述,我认为你想要这个:
<?php // MyClass.php
class MyClass
{
protected $_prop;
include 'myclass-methods.php';
}
<?php // myclass-methods.php
public function myMethod()
{
$this->$_prop = 1;
}
运行这段代码会导致
Parse error: syntax error, unexpected T_INCLUDE, expecting T_FUNCTION
这是可能的
<?php // MyClass.php
class 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 中应该这样做的方式。这完全是错误的,应该让你的眼睛流血。
既然你想动态改变行为,扩展类也不是一个好的选择(见下文)。你真正想做的是写一个interface 并让你的类使用实现这个接口的对象,从而确保适当的方法可用。这称为Strategy Pattern,其工作方式如下:
<?php // Meowing.php
interface Meowing
{
public function meow();
}
现在你得到了所有喵喵行为必须遵守的契约,即拥有喵喵方法。接下来定义一个喵喵叫行为:
<?php // RegularMeow.php
class RegularMeow implements Meowing
{
public function meow()
{
return 'meow';
}
}
现在要使用它,使用:
<?php // Cat.php
class Cat
{
protected $_meowing;
public function setMeowing(Meowing $meowing)
{
$this->_meowing = $meowing;
}
public function meow()
{
$this->_meowing->meow()
}
}
通过将 Meowing TypeHint 添加到 setMeowing,您可以确保传递的参数实现了 Meowing 接口。让我们定义另一个喵喵叫行为:
<?php // LolkatMeow.php
class LolkatMeow implements Meowing
{
public function meow()
{
return 'lolz xD';
}
}
现在,您可以轻松地交换如下行为:
<?php
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';
虽然您也可以通过定义 abstract BaseCat 和 meow 方法,然后从中派生具体的 RegularCat 和 Lolkat 类,使用 inheritance 解决上述问题,但您必须考虑您想要实现的目标。如果您的猫永远不会改变它们喵喵叫的方式,请继续使用继承,但如果您的 RegularCat 和 Lolkat 应该能够进行任意喵喵叫,则使用策略模式。
有关 PHP 中的更多 design patterns,请查看以下资源: