[英]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.