如何在扩展类时访问方法

时间:2015-01-09 18:32:58

标签: php oop

我正在研究https://github.com/Westie/OUTRAGEbot中的一些自定义代码,而且对OO的东西不太熟悉,我遇到了问题。

我正在尝试访问我在Script文件夹中另一个文件中名为Logger / Default.php的文件中定义的方法(writeToLog)。从其他示例中我可以看到整个代码,我应该能够使用$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");
    } 
}

1 个答案:

答案 0 :(得分: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();
    }

}