亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我可以將代碼包含到PHP類中嗎?

我可以將代碼包含到PHP類中嗎?

PHP
慕絲7291255 2019-08-17 15:55:57
我可以將代碼包含到PHP類中嗎?我想創建一個PHP類,比方說Myclass.php?,F在在該類中我想要定義類本身和一些實例變量。但是所有方法都必須來自Myclass_methods.php文件。我可以將該文件包含在類體中嗎?我有很好的理由為什么我要分開這個。簡而言之,我將擁有一個后端,我可以在其中更改類的業務邏輯,而所有其他事情必須保持不變。系統為我維護所有ORM和其他東西。但是如果這是一個壞主意,那么在編輯業務邏輯之后重新生成整個類文件可能會更好(因此,在這種情況下是用戶定義的方法)。性能問題:如果在一個請求中只包含一次Myclass.php,實際上Myclass_methods.php也應該只被包含一次??赡苁清e的。專家?
查看完整描述

3 回答

?
慕碼人2483693

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應該能夠做任意的喵喵,那么使用策略模式。


查看完整回答
反對 回復 2019-08-17
?
DIEA

TA貢獻1820條經驗 獲得超3個贊

創建具有相關基本功能的核心類可能不是一個想法,然后使用所需的方法擴展它 - 這似乎是一種更合乎邏輯的方法。


查看完整回答
反對 回復 2019-08-17
  • 3 回答
  • 0 關注
  • 502 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號