我的 PHP 应用程序中有几个地方,根据之前调用的函数,如果出现问题,我需要显示不同的错误消息。
例如,在下面的示例中,如果您直接在“文件”上调用 startEdit() 函数并且文件被锁定,它应该返回特定的错误消息。但是,如果 startEdit() 函数由于其父“文件夹”中的 startEdit() 函数而被调用,则它应该显示不同的错误消息(参见下面的示例):
<?php
class folder{
public $files = array();
public function startEdit(){
//when we start editing a folder, start editing all files within it
foreach($this->files as $file){
$file->startEdit();
}
}
}
class file{
public $isLocked = true;
public function startEdit(){
try{
//if the file is locked we need to throw an exception
if($this->isLocked==1){
//loop through the stack trace to see if this was called from the folder class.
foreach(debug_backtrace() as $frame){
if($frame['class']=='folder'){
throw new Exception("Cannot edit this folder because one of the files within it are locked");
}
}
//if not called from the folder class then throw a different error
throw new Exception("This file is locked");
}
}catch(Exception $e){
exit("Exception: ".$e->getMessage());
}
}
}
//create a new folder
$folder = new folder();
//put some files within it
$file1 = new file();
$file2 = new file();
$folder->files = array($file1, $file2);
//start editing the folder - should return the message 'Cannot edit this folder because one of the files within it are locked'
$folder->startEdit();
//try editing one of the files - should return the message 'This file is locked'
$file1->startEdit();
?>
这是我正在尝试做的一个非常简化的版本 - 在我的应用程序中,错误消息可能取决于一个在 5 或 6 个堆栈帧之前调用的函数。
我的问题是 - 这是一种有效的做事方式吗?有没有更好的方法来实现这一点?
谢谢!
更新
为了清楚起见,我不想向用户显示实际的堆栈跟踪,我想使用堆栈跟踪为用户创建更多有用的消息。我猜另一种方法是将另一个参数传递给每个函数,告诉它从哪里调用它?
有没有其他人尝试过做类似的事情?对此的任何帮助将不胜感激!