PHP OOP。如何获取类的常量__METHOD__的值是什么在其他类中创建其他类的实例?

时间:2014-11-27 11:57:21

标签: php class oop

我们有A班和B班。
B级公共财产$ class_a 几个函数很少有B类函数可以设置$this->class_a = new A(__METHOD__);
我需要知道A类中B类 __ METHOD __ 的价值。
现在我在A类中使用:

public function __construct($owner_method){
//some code..
}

是否有可能在构造期间不传递此参数?
当我进入A级时,是否可以访问“类所有者”的常量?

3 个答案:

答案 0 :(得分:1)

我个人认为更好的解决方案是将“日志系统”类实例化一次,将其作为参数传递给其他类(DI),然后在每个日志记录操作中,您可以使用某些方法来执行工作。这样你就可以清除__construct

class A
{
    public function __construct() {
    }

    public function log($owner_method) {
        //job
    }
}

没有办法知道哪个类实例化了类A,也许,通过解析堆栈跟踪 - 但那很奇怪。

答案 1 :(得分:1)

我认为你需要像现在一样传递它。 get_parent_class存在,但是当你扩展对象时,你没有这样做,所以传递它似乎不仅是唯一的选择,而且对我来说更合适和可重复使用。

简而言之:不,你需要继续传递它,无论是在构造函数中还是在单独的log方法中。

答案 2 :(得分:0)

这是我写的日志类:

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();将是eaiser,它可以保证第三方类无法伪造LOG数据。
如果php有 get_owner_class ,而不仅仅是get_parent_class .. :(