2015-01-09 42 views
1

我正在研究https://github.com/Westie/OUTRAGEbot中的一些自定義代碼,並且對面向對象的東西不太熟悉,我遇到了一個問題。如何在擴展類時訪問方法

我試圖訪問一個方法(writeToLog),我在Script文件夾中的另一個文件中定義了一個名爲Logger/Default.php的文件。從整個代碼中我可以看到的其他示例中,我應該只能使用$this->writeToLog,但當我這樣做時沒有任何反應。從Logger/Default.php訪問方法的作品,我有文件正確的順序加載,所以我迷路了。我也嘗試過print_r $this,使用parent::等等。我知道這可能是簡單的,因爲我對面向對象的代碼缺乏瞭解,但是我現在處於困境。

每請求時,這裏是代碼的副本:

class Logger extends Script 
{ 
    public function writeToLog($folder=NULL, $logFile, $message) 
    { 
     if(empty($logFile) || empty($message)) 
     { 
      error_log('No log file or message passed to logging class', 0, ROOT.'.logs/error.log'); 
      return; 
     } 

     date_default_timezone_set('UTC'); 

     $folder = (strlen($folder) > 0) ? "/".str_replace("#", "", $folder) : ""; 
     $logFilePath = ROOT."/logs".$folder; 

     if(!file_exists($logFilePath)){ mkdir($logFilePath, 0775, true); $this->writeToLog(NULL, 'general.log', "$logFilePath does not exist, creating!"); } 

     $fullLogFile = $logFilePath."/".$logFile; 

     $message = "[".date('Y-m-d H:i:s')."]".$message."\n"; 
     error_log($message, 3, $fullLogFile); 
    } 
} 

而在這其中後加載新的腳本:

class NewScriptName extends Script { 
    public function onChannelMessage($sChannel, $sNickname, $sMessage) 
    { 
     // Log the message to a log on the server 
     $this->writeToLog($sChannel, "chat_log.log", "$sNickname: $sMessage"); 
    } 
} 
+0

「沒有任何反應」通常意味着您沒有啓用正確的錯誤報告。做些無效的事情時你應該會收到錯誤信息! – kero 2015-01-09 18:35:20

+2

你可以發佈一個「不」的工作示例或你自己的代碼嗎?你是否擴展了Logger類的類?該功能是否公開?保護?私人的?請介意@kingkero評論。 – JoshuaBehrens 2015-01-09 18:44:14

+0

對不起,在代碼示例中添加。另外,我確保cli腳本正在進行日誌記錄,但是當我嘗試使用$ this-> writeToLog調用時,我沒有看到任何記錄。我也會期待一個錯誤或者什麼,但是沒有什麼 – 2015-01-09 18:50:18

回答

1

Logger擴展ScriptNewScriptName擴展ScriptNewScriptName雖然沒有擴展Logger。您試圖訪問父類Script中不存在的函數,但是在同級類Logger中。沒有關係將這些類聯繫在一起。您必須擴展Logger或實例化NewScriptName類中的類才能訪問該函數。這個概念被稱爲繼承。

就像孩子從父母那裏繼承特徵一樣,擴展另一個類的類可以訪問父類的publicprotected屬性和方法。但是,繼承是單向的。父母不會從他們的孩子繼承特徵。同樣,父類不能訪問擴展(子)類的函數或屬性(即使它們是protectedpublic)。

Logger -> extends -> Script 
- Logger can access all public/protected properties of Script 
- Logger can access all public/protected methods of Script 
- Logger can access the writeToLog method but Script can not 

NewScriptName -> extends -> Script 
- NewScriptName can access all public/protected properties of Script 
- NewScriptName can access all public/protected methods of Script 
- NewScriptName has no knowledge of Logger 

方法1:

有兩種方法來解決這個問題。 NewScriptName類可以擴展Logger類,像這樣:

class NewScriptName extends Logger { 
    ... 
} 

這將創建下列繼承鏈:

Script -> Logger -> NewScriptName 

方法2:

或者,您也可以在創建的Logger本地實例NewScriptName當您通過__construct()功能實例化類時:

class NewScriptName extends Script { 

    private $logger; 

    public function __construct() { 
     $this->logger = new Logger(); 
    } 

} 
+0

好吧,如果我想讓這個日誌記錄方法可用,那麼我將不得不將它添加到其中一個主要文件中,然後如果我理解了你的話。謝謝,我正在慢慢地圍繞着這些概念。 – 2015-01-09 19:06:58

+0

您可以將其添加到主文件或實例化該類,並將其分配給像'$ Logger'這樣的全局變量。那麼你應該能夠從任何地方訪問它。頭繞着你很多東西。 – War10ck 2015-01-09 19:08:20