Nasıl sınıf adı veya geçerli nesne instianiated nesnenin dosya alabilirim?

4 Cevap php

Netleştirmek için:

Bana kolayca mesajları oturum sağlayan bir Logger sınıfı inşa ediyorum:

lib.Logger.php:

<?php
class Logger {
    private $handle;

    public function __construct($log_name, $log_path) {

        if ( ! is_dir($log_path))
            throw new Exception('Log path does not exist.');

        if ( ! in_array(strtolower(substr($log_name, 0, -4)), array('.log', '.txt')))
            $log_name = "{$log_name}.log";

        $this->handle = fopen("{$log_path}/{$log_name}", 'a');

        $this->log('------------- Initializing ------------- '.get_parent_class($this));
    }

    // --------------------------------------------------------------------

    public function __destruct() {
        fclose($this->handle);
    }

    // --------------------------------------------------------------------

    public function log($message) {
        $time = date(DATE_RFC822);

        $log = "[{$time}] {$message}\n";

        fwrite($this->handle, $log);
    }    

}

?>

Ve ben kullanarak bu çağırır:

MyController.php:

<?php
class MyController extends Controller {
    $logger = new Logger('testlog','/path/to/logs/');
    $logger->log('Logs are fun!');
}
?>

Ben nesnesi başlatılamıyor zaman:

 $this->log('------------- Initializing ------------- '.get_parent_class($this));

Bu durumda, ya

MyController
veya
/path/to/MyController.php
- Ben log () çağrılırken olduğunu nesne (veya dosyayı) adı oturum istiyorum.

I) (get_parent_class kullanarak çalıştı, ancak Logger başına bir üst sınıfı yok, çünkü elbette bu işe yaramazsa.

Herhangi bir fikir? Yardımlarınız için çok teşekkür ederim!

Alex B

4 Cevap

Örtülü bu işlemek için tek yolu başkalarının önerdi gibi debug_backtrace gelen çıkış yakalamak için.

Eğer açık bir yaklaşım istiyorsanız, belki bu da olabilir

Logger

public function initialize( $context )
{
  $logMessage = '------------- Initializing ------------- ';
  if ( is_object( $context ) )
  {
    $logMessage .= get_class( $context );
  } else {
    // do something else?
  }
  $this->log( $logMessage );
}

ve daha sonra

class MyController extends Controller
{
  public function someFunc()
  {
    $logger = new Logger('testlog','/path/to/logs/');
    $logger->initialize( $this );
    $logger->log('Logs are fun!');
  }
}

Dün gece (neredeyse) tam bu sorun koştu. Ben bunu çözmek için debug_backtrace() (gibi diğerleri zaten belirtmiştik) kullanıyorum. Ben belli bir işlevi çağırıyordu denetleyicisi içeren modül bilmek gerekiyordu. Benim kontrolörleri sınıf isim içinde modül adını içerdiğinden, ben sadece debug_backtrace () ve explode () modül adı almak için ed gelen getiriyi yakaladı.

Soulmerge dönüş her zaman tutarlı değil varlık hakkında iyi bir nokta yapar, ancak kod belirli bir şekilde yapı eğer kesinlikle doğru yeterince getiri elde edebilirsiniz.