扩展 类 时如何访问方法
how to access a method when extending classes
我正在 https://github.com/Westie/OUTRAGEbot 中编写一些自定义代码,并且对 OO 的东西不是很熟悉,我 运行 遇到了问题。
我正在尝试从脚本文件夹中的另一个文件访问我在名为 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");
}
}
Logger
扩展了 Script
,NewScriptName
扩展了 Script
。 NewScriptName
并没有扩展 Logger
。您正在尝试访问 parent class Script
中不存在但在同级 class Logger
中的函数。将这些 class 联系在一起没有任何关系。您必须扩展 Logger
或在 NewScriptName
class 中实例化 class 才能访问该函数。这个概念叫做继承。
就像 children 从他们的 parent 继承特征一样,扩展另一个 class 的 class 可以访问 parent class 的 public
和 protected
属性和方法。然而,继承是一条one-way街。 parent 不会继承其 child 的特征。同样,parent class 将无法访问扩展的 (child) class 的函数或属性(即使它们是 protected
或 public
).
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
方法一:
有两种方法可以解决这个问题。 Class NewScriptName
可以像这样扩展 class Logger
:
class NewScriptName extends Logger {
...
}
这将创建以下继承链:
Script -> Logger -> NewScriptName
方法二:
或者,当您通过 __construct()
函数实例化 class 时,您可以在 NewScriptName
中创建 Logger
的本地实例:
class NewScriptName extends Script {
private $logger;
public function __construct() {
$this->logger = new Logger();
}
}
我正在 https://github.com/Westie/OUTRAGEbot 中编写一些自定义代码,并且对 OO 的东西不是很熟悉,我 运行 遇到了问题。
我正在尝试从脚本文件夹中的另一个文件访问我在名为 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");
}
}
Logger
扩展了 Script
,NewScriptName
扩展了 Script
。 NewScriptName
并没有扩展 Logger
。您正在尝试访问 parent class Script
中不存在但在同级 class Logger
中的函数。将这些 class 联系在一起没有任何关系。您必须扩展 Logger
或在 NewScriptName
class 中实例化 class 才能访问该函数。这个概念叫做继承。
就像 children 从他们的 parent 继承特征一样,扩展另一个 class 的 class 可以访问 parent class 的 public
和 protected
属性和方法。然而,继承是一条one-way街。 parent 不会继承其 child 的特征。同样,parent class 将无法访问扩展的 (child) class 的函数或属性(即使它们是 protected
或 public
).
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
方法一:
有两种方法可以解决这个问题。 Class NewScriptName
可以像这样扩展 class Logger
:
class NewScriptName extends Logger {
...
}
这将创建以下继承链:
Script -> Logger -> NewScriptName
方法二:
或者,当您通过 __construct()
函数实例化 class 时,您可以在 NewScriptName
中创建 Logger
的本地实例:
class NewScriptName extends Script {
private $logger;
public function __construct() {
$this->logger = new Logger();
}
}