2011-11-28 79 views
2

我將一個現有的項目移植到命名空間,最後我碰到了一些牆,官方文檔無法幫助我。也許你們可以! :)關於PHP命名空間的一些問題

1)我如何從命名空間上面的級別擴展一個類?例如:

namespace MyProject\Exceptions; 

abstract class Handler { 

} 

namespace MyProject\Exceptions\Handlers; 

class Test extends \MyProject\Exceptions\Handler { 

} 

2)如何使用具有期望回調函數的命名空間?

namespace MyProject; 

class Main { 
    public function __construct() { 
     set_error_handler(array('MyProject', 'handleErrors')); 
    } 

    public function handleErrors() { 
     echo "hi"; 
    } 
} 

回答

0

就像其他命名空間的東西。但是,一定要避開反斜槓!

CNC中

既然我們在談論「現代PHP」在這裏,我強烈建議只是傳遞一個函數作爲回調而不是用你建立一個回調的方式。現在,您可以簡單地接受一個函數並將其用作回調函數,就像您在其他編程語言(如C++)中所做的那樣。

namespace Foo; 
function Bar($callback) { $callback(); } 

// Other file 
Foo\Bar(function() { 
    // Do something 
}); 
+0

當然,使用適當的類型檢查。其他任何人都希望看到類型檢查函數foo(function bar){}'?或者更可能的是,'function foo(Callable bar){}'https://wiki.php.net/rfc/callable –

0

問題1:在當前命名空間「上方」尋址命名空間沒有簡寫。你必須使用完整的路徑,就像你上面已經做過的那樣。

問題2:您可以使用匿名函數(這是在5.3中引入),這通常可能是一個不錯的選擇是正確的:

namespace MyProject; 

class Main { 
    public function __construct() { 
     set_error_handler(function() { 
       echo "hi"; 
     }); 
    } 
} 

然而,它並不總是最好使用匿名功能。函數是一個有用的抽象,因爲你可以從不同的地方調用它們。匿名函數是創建只需要一次的函數的簡寫。

如果你想使用一個常規的非匿名函數,請注意:第一,在你上面的例子中,你正在使用的實例方法,所以你必須提供一個實例以$此:

namespace MyProject; 

class Main { 
    public function __construct() { 
     set_error_handler(array($this, 'handleErrors')); 
    } 

    public function handleErrors() { 
     echo "hi"; 
    } 
} 

另外,在這種情況下,您想要從命名空間類中尋址靜態函數。在這種情況下,數組語法必須包含類名稱。如果類名具有名稱空間,則應該像使用源代碼一樣使用完整的名稱空間路徑:

namespace MyProject; 

class Main { 
    public function __construct() { 
     set_error_handler(array('MyProject\Main', 'handleErrors')); 
    } 

    public static function handleErrors() { 
     echo "hi"; 
    } 
}