2015-05-05 41 views
0

我有3個文件,聲明命名空間(例如簡約):PHP中的函數GLOBAL的範圍是什麼?

<?php //f1.php 
    namespace Sheet; 
    $base = [1,2,3]; 
?> 

<?php // f2.php 
    namespace Sheet; 
    require_once('f1.php'); 
    var_dump($base);         // ----> array(1,2,3) 
    class Reader { 
    public static function get($pos) { 
     GLOBAL $base; 
     var_dump($base);        // ----> NULL 
     foreach ($base as $idx => $val) { 
     if ($pos == ($idx +1)) return $base[$idx]; 
     } 
     return null; 
    } 
    } 
?> 

<?php //test.php 
    namespace Test; 
    require_once('f2.php'); 
    print \Sheet\Reader::get(1); // expected: '2' 
?> 

不知怎的,我得到的foreach無效參數異常。

我想知道GLOBAL聲明的範圍是什麼 - 有什麼想法?

編輯:我如何以更方便的方式訪問函數get()中的變量?

+3

@PedroLobito誰能想到它是如此的邏輯? :) – Rizier123

+0

更好的改寫:我如何從同一個命名空間的函數中訪問命名空間的'$ base'變量? – BananaAcid

+0

你應該通過它作爲獲取方法 –

回答

0

推可變進要訪問的$GLOBALS數組。只要確定,沒有名稱衝突。將對象轉換爲對象會覆蓋以前的內容,因此請確保優化此部分。我在這兩個地方使用了__NAMESPACE__,因爲訪問類是相同的。

<?php //f1.php 
    namespace Sheet; 
    $base = [1,2,3]; 

    // globalise objectified var! 
    $GLOBALS['NSvars'] = [__NAMESPACE__ => (object)['base' => $base]]; 
?> 

<?php // f2.php 
    namespace Sheet; 
    require_once('f1.php'); 
    var_dump($base);         // ----> array(1,2,3) 
    class Reader { 
    public static function get($pos) { 
     GLOBAL $NSvars; 
     $base = $NSvars[__NAMESPACE__]->base;  // use the global 
     var_dump($base);        // ----> array(1,2,3) 
     foreach ($base as $idx => $val) { 
     if ($pos == ($idx +1)) return $base[$idx]; 
     } 
     return null; 
    } 
    } 
?> 

<?php //test.php 
    namespace Test; 
    require_once('f2.php'); 
    print \Sheet\Reader::get(1); // expected: '2' 
?> 

更加面向對象的方法:

<?php //f1.php 
    namespace Sheet; 
    abstract class Defs { 
    public static $base = [1,2,3]; 
    } 
?> 

<?php // f2.php 
    namespace Sheet; 
    require_once('f1.php'); 
    class Reader { 
    public static function get($pos) { 
     foreach (Defs::$base as $idx => $val) { 
     if ($pos == ($idx +1)) return Defs::$base[$idx]; 
     } 
     return null; 
    } 
    } 
?> 

<?php //test.php 
    namespace Test; 
    require_once('f2.php'); 
    print \Sheet\Reader::get(1); // expected: '2' 
?> 
0

使用global $baseReader::get方法內允許該方法本身使用$base變量(在f1.php聲明),否則代碼將產生未定義的變量通知並在一個的foreach無效參數警告