簡體   English   中英

PHP OOP。 如何獲取類的常量__METHOD__的值,該類在另一個類中創建另一個類的實例?

[英]PHP OOP. How to get value of constant __METHOD__ of class what create an instance of other class inside that other class?

我們有A類和B類。
B類具有公共財產$ class_a。
少數函數B類的少數函數可以設置$this->class_a = new A(__METHOD__);
我需要知道A類中B類__METHOD__的值。
現在我在A類內部使用:

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

是否有可能在構造過程中不傳遞此參數?
當我在A類中時,是否可以訪問“類所有者”的此類常量?

我個人認為更好的解決方案是實例化一次“日志記錄系統”類,將其作為參數( DI )傳遞給其他類,然后在每次記錄日志操作時,可以使用某種方法來完成此工作。 這樣,您便擁有了干凈的__construct

class A
{
    public function __construct() {
    }

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

也許無法通過解析stacktrace來知道哪個類實例化了A類,但是那很奇怪。

我認為您需要像現在這樣通過。 get_parent_class存在,但是那是當您擴展對象時(您沒有做的),因此傳遞它不僅是唯一的選擇,而且對我來說更合適並且可重用。

簡而言之:不,您需要繼續傳遞它,無論是在構造函數中還是在單個log方法中。

這是我的班級,用於編寫日志:

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 .. :(

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM