我们有A类和B类。
类 B 具有公共属性 $class_a。
很少有函数 B 类的函数可以设置$this->class_a = new A(__METHOD__);
我需要知道 A 类中 B 类__METHOD__的值。
现在我在类 A 中使用:
public function __construct($owner_method){
//some code..
}
是否可以在构造过程中不传递此参数?
当我在该类 A 内时,是否可以访问"类所有者"的此类常量?
我认为您需要像当前一样传递它。 get_parent_class
存在,但那是当你扩展对象时,你没有这样做,所以传递它似乎不仅是唯一的选择,而且对我来说更合适和可重用。
简而言之:不,您需要继续传递它,无论是在构造函数中还是在单个log
方法中。
我个人认为更好的解决方案是实例化该"日志记录系统"类一次,将其作为参数传递给其他类(DI
),然后在每个日志记录操作上,您可以使用一些方法来完成这项工作。这样你就有了干净的__construct
。
class A
{
public function __construct() {
}
public function log($owner_method) {
//job
}
}
没有办法知道哪个类实例化了类A
,好吧,也许,通过解析堆栈跟踪 - 但这很奇怪。
这是我
的类 用于写入日志:
class Dll_Log {
protected $data = array();
protected $function = NULL;
private $path = FALSE;
public function __construct($function){
$function = str_replace('::','-',$function);
$this->function = $function;
$this->path = $_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR.'assets'.DIRECTORY_SEPARATOR.'log'.DIRECTORY_SEPARATOR;
}
public function set($data){
$this->data = array_merge((array)$this->data, (array)$data);
return $this;
}
public function __destruct(){
if(WRITE_LOG AND (count($this->data)>0)){
$this->data = array('data'=>$this->data, 'time'=>date("H:i:s"));
$file = $this->path.date("Y-m-d").DIRECTORY_SEPARATOR.$this->function;
$dirname = dirname($file);
if (!is_dir($dirname)){
mkdir($dirname, 0755, true);
}
$f = fopen ($file, 'a+' );
flock ( $f, LOCK_EX );
fwrite($f,json_encode($this->data).PHP_EOL);
flock ( $f, LOCK_UN );
fclose ( $f );
}
}
因此,当我调试某些类(例如类 B)时,方法load_page:接下来我必须做:
Class B{
public function load_page(){
$logger = New Dll_Log(__METHOD__);
if( ($x = do_something()) !==false)
$logger->set(array('x-val-problem'=>'$x received FALSE value'));
if( ($y = do_something_other()) !==false)
$logger->set(array('y-val-problem'=>'$y received FALSE value'));
if( ($z = do_something_else()) !==false)
$logger->set(array('z-val-problem'=>'$z received FALSE value'));
try{
SomeClass::SomeMethod($x,$y,$z);
}catch(Exception $e){
$logger->set(array('GOT_EXCEPTION'=>$e));
}
}
}
正如你所看到的,每次我$logger = New Dll_Log(__METHOD__);
时 - 它有点不舒服。 $logger = New Dll_Log();
会更轻松,它可以保证第三方类将无法伪造LOG数据。
如果 php 有get_owner_class,那就太好了,不仅get_parent_class
..:(