簡體   English   中英

在方法中訪問全局變量

[英]Accessing a Global Variable in a Method

我認為我的問題有點笨拙,但我無法弄清楚這些東西如何與PHP一起使用。 這是一個自動加載的類,我想使用它的日志記錄類。 我知道我也可以將$log作為實例變量,但是我想要那樣。

namespace Bal\Blub;

$log = new Logger('activities');
$log->pushHandler(new StreamHandler(__DIR__.'/../../log/activties.log', Logger::DEBUG));


$log->debug("is working here");

class Foo {
    public function bar() {
       global $log;
       $log->debug("this is my message");
    }
}

我不明白為什么$log在這種情況下沒有價值...

編輯:當然,我的意思是global而不是public

好的,謝謝您的代碼風格建議。 我很清楚全局變量是錯誤的做法。 雖然這不是我的問題。 答案是在命名空間范圍內也使用global變量,這是有道理的,但是如果您習慣使用PHP腳本編制方法,這有點奇怪。

namespace Bal\Blub;

global $log;

$log = new Logger('activities');
$log->pushHandler(new StreamHandler(__DIR__.'/../../log/activties.log', Logger::DEBUG));


$log->debug("is working here");

class Foo {
    public function bar() {
       global $log;
       $log->debug("this is my message");
    }
}

這是全局的$ log。 不是公開的$ log。

不過要小心。 全球人總是邪惡的。 如果您確實需要全局變量,請至少使用靜態變量。

<?php 
class Globalholder{
   public static $log;

}
Globalholder::$log = new Logger(...);


function foo(){
   $log = Globalholder::$log;
   $log->logsomething("Hello World");
}

global關鍵字,像全局變量一樣起作用的靜態類屬性,單例類...都可以使用,但是既然如此,為什么不嘗試避免不良做法並使用DI?

現在,您的Foo類與Logger類緊密結合在一起,這可能會使維護變得困難,無論何時,有一天,您將更改對Logger類的所有引用。

為什么不這樣簡單一些:

class Foo

   protected $logger;

   public function __construct(Logger $logger)
   {
      $this->logger = $logger;
   }

   public function bar($string)
   {
       $this->logger->debug($string);
   }
}

$log = new Logger('activities');
$foo = new Foo($log);
$foo->bar("test");

這樣,您就可以將兩個類解耦(我知道可以使此代碼做得更好),並且還可以通過傳遞模擬Logger對象來使代碼易於測試。

暫無
暫無

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

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