3 回答
TA貢獻1860條經驗 獲得超9個贊
不可以。您不能在課程正文中包含文件。
在定義類的文件中,您只能在方法體中或類體外部包含文件。
從你的描述中我帶你想要這個:
<?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;}這樣做會將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中完成它。這是完全錯誤的,應該讓你的眼睛流血。
由于您希望動態更改行為,因此擴展類也不是一個好選擇(請參閱下面的原因)。你真正想要做的是編寫一個接口,讓你的類使用實現這個接口的對象,從而確保適當的方法可用。這稱為戰略模式,其工作方式如下:
<?php // Meowing.php interface Meowing{
public function meow();}現在你得到了所有Meowing Behaviors必須遵守的合同,即采用喵喵方法。接下來定義一個Meowing行為:
<?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()
}}通過將Meowing TypeHint添加到setMeowing,可以確保傳遞的param實現了Meowing接口。讓我們定義另一種喵喵行為:
<?php // LolkatMeow.phpclass 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';
雖然你也可以通過定義一個抽象的 BaseCat和meow方法,然后從中派生出具體的RegularCat和Lolkat類來解決上面的繼承問題,你必須考慮你想要實現的目標。如果你的貓永遠不會改變它們的喵喵方式,那就繼續使用繼承,但是如果你的RegularCat和Lolkat應該能夠做任意的喵喵,那么使用策略模式。
- 3 回答
- 0 關注
- 502 瀏覽
添加回答
舉報
