不可以。您不能在类体中包含文件。
在定义类的文件中,您只能包含方法体或以外的类体中的文件。
从你的描述我把你想这样的:
<?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;
}
这样做,这样,会将include文件的内容导入方法范围,而不是类范围。您可以在include文件中包含函数和变量,但不包括方法。您可以但不应该也将整个脚本放入其中,并更改该方法的作用,例如,
<?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()
}
}
通过添加喵喵叫TypeHint到setMeowing,您确保传递PARAM实现喵喵叫声接口。让我们来定义另一喵喵叫的行为:
<?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和喵方法,然后解决了以上inheritance从中得到具体的RegularCat和Lolkat类,你必须考虑你想要达到的目标。如果你的猫永远不会改变他们的喵喵声,继续使用继承,但是如果你的RegularCat和Lolkat应该能够执行任意的meows,那么就使用策略模式。说我不是太
不这样做,学会正确使用OOP。 – 2009-12-24 11:39:01
使用命名空间! – zloctb 2013-09-28 17:39:09