【问题标题】:Can PHP namespaces contain variables?PHP 命名空间可以包含变量吗?
【发布时间】:2011-07-14 07:48:34
【问题描述】:

PHP 命名空间可以包含变量吗?如果可以,如何实现?

【问题讨论】:

  • 你试过了吗?如果你尝试过,结果如何?
  • @Charles 或者他可以问,得到一个正确的答案并帮助未来的读者......而不是每个人都必须自己“尝试”。

标签: php variables namespaces


【解决方案1】:

您可以通过将变量包装在函数中来将变量绑定到命名空间。

<?php
 namespace furniture;
// instead of declaring a $version global variable, wrap it inside a function
function version(){
 return "1.3.4";
}
?>

【讨论】:

    【解决方案2】:

    这是不可能的,因为$MYVARNAME 仍在全局范围内。试试下面的代码。

    namespace.php

    <?php
        namespace MYNAME;
        use MYNAME as M;
        const MYVAR   = 'MYVARNAME';
    
        ${M\MYVAR}    = date('Y');
        echo $MYVARNAME;  // PRINT YEAR
        $MYVARNAME    = 'X';
        echo $MYVARNAME;  // PRINT X
        echo ${M\MYVAR} ; // PRINT X
    
        include('file.php');
    ?>
    

    file.php

    <?php
        ${MYNAME\MYVAR}=date('Y');
        echo $MYVARNAME;        // PRINT YEAR
        $MYVARNAME = 'X';
        
        echo $MYVARNAME;        // PRINT X
        echo ${MYNAME\MYVAR};   // PRINT X
        
        include('file2.php');
    ?>
    

    file2.php

    <?php
        namespace MYNAME2;
        use MYNAME2 as N;
        const MYVAR   = 'MYVARNAME';
    
        ${N\MYVAR}    = 'Y';
        echo $MYVARNAME;  // PRINT Y
        echo ${MYNAME\MYVAR}; /* PRINT Fatal error: Uncaught Error:
        Undefined constant 'MYNAME2\MYNAME\MYVAR' */
    ?>
    

    【讨论】:

      【解决方案3】:

      将完整的 classPath 存储在变量中并在“新”之后使用。

      意识到反斜杠在字符串中用作转义字符非常重要,因此在字符串中使用时应始终加倍。

      <?php
      $a = "namespace\\className"; // 'which will print namespace/className'
      $obj = new $a;
      ?>
      

      【讨论】:

        【解决方案4】:

        可以做到——差不多。

        这可能非常糟糕并且永远不应该这样做,但可以通过使用variable variablesmagic constant 作为命名空间来实现。 所以一个字符串变量来命名我们想要使用的变量,像这样:

        <?php
        namespace your\namespace;
        
        $varname = __NAMESPACE__.'\your_variablename'; //__NAMESPACE__ is a magic constant
        $namespaced_variable = $$varname; //Note the double dollar, a variable variable
        ?>
        

        【讨论】:

        • 问题是Can PHP namespaces contain variables? 而不是Can PHP variables contain namespaces?
        【解决方案5】:

        试试这个

        <?php
        namespace App\login; 
        
        $p = 'login';
        $test2 = '\App\\'.$p.'\\MyClass';
        
        $test = new $test2;
        

        【讨论】:

        • 命名空间必须是文件的第一行。不是吗?
        • 这肯定有效,我这样使用它: $class= '\\'.$vendor.'\\'.$application.'\\Router';返回新的 $class();
        • 这里使用单或双`\`的规则是什么?
        • @IstiaqueAhmed 我认为这里没有规则 \A 恰好不是转义字符。在这种情况下,无论哪种方式,总是逃避 `` 可能会更好
        【解决方案6】:

        他们不能,正如马里奥所说。

        要封装变量,请使用。绝对应该避免污染全局变量空间。

        • 例子

          class_dbworker.php:

          class DbWorker
          {
              //properties and method logic
          }
          
          class DbWorkerData
          {
              public static $hugerelationsmap = array(....);
              public static ....
          }
          

          mainapp.php:

          include_once 'class_dbworker.php';
          print_r( DbWorkerData::$hugerelationsmap );
          
        • 使用命名空间的示例

          class_dbworker.php:

          namespace staticdata;
          class DbWorker
          {
              //properties and method logic
          }
          
          class DbWorkerData
          {
              public static $hugerelationsmap = array(....);
              public static ....
          }
          

          mainapp.php:

          include_once 'class_dbworker.php';
          
          use staticdata as data;
          
          print_r( \data\DbWorkerData::$hugerelationsmap );
          

        【讨论】:

          【解决方案7】:

          没有。您可以在声明命名空间后设置变量,但变量将始终存在于全局范围内。它们永远不会绑定到名称空间。您可以从

          中没有任何名称解析描述来推断

          也不允许在命名空间中定位变量的语法。

          print \namespace\$var;      // syntax error
          
          print "${namespace\\var}";  // "unexpected T_NS_SEPARATOR"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-05-28
            • 2016-05-23
            • 1970-01-01
            • 2016-07-07
            • 2014-09-06
            • 2016-10-23
            • 1970-01-01
            相关资源
            最近更新 更多