Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
[PHP]:在静态类定义中将函数return用作数组数据_Php_Oop_Class Constants - Fatal编程技术网

[PHP]:在静态类定义中将函数return用作数组数据

[PHP]:在静态类定义中将函数return用作数组数据,php,oop,class-constants,Php,Oop,Class Constants,由于$directories的定义,我对此类定义有问题。请帮助: <?php ..... class Config { public static $directories = array( "resources" => realpath(__DIR__), "root" => $_SERVER['DOCUMENT_ROOT'], "branch" => $_SERVER['DOCUMENT_ROOT'] . "/bra

由于
$directories
的定义,我对此类定义有问题。请帮助:

<?php
 .....
 class Config {

   public static $directories = array(
      "resources" => realpath(__DIR__),
       "root" => $_SERVER['DOCUMENT_ROOT'],
       "branch" => $_SERVER['DOCUMENT_ROOT'] . "/branch",
       "templates" => realpath(__DIR__ . '/templates'),
       "library" => realpath(__DIR__ . '/library'),
       "views" => realpath(__DIR__ . '/views'),
       "controllers" => realpath(__DIR__ . '/controllers'),
       "backups" => realpath(__DIR__ . '/backups')
    );

  }
?>

在声明类/对象变量/常量时不能调用函数。您也不能使用字符串连接。它相当有限

更新: 您可以使用以下变通方法(编写时花了一点时间),这有点难看,因为它需要定义两次常量:

<?php

define('CONFIG_DIRECTORY_RESOURCES', realpath(__DIR__));
define('CONFIG_DIRECTORY_ROOT', $_SERVER['DOCUMENT_ROOT']);
define('CONFIG_DIRECTORY_BRANCH', $_SERVER['DOCUMENT_ROOT'] . '/branch');
define('CONFIG_DIRECTORY_TEMPLATES', CONFIG_DIRECTORY_RESOURCES . '/templates');
define('CONFIG_DIRECTORY_LIBRARY', CONFIG_DIRECTORY_RESOURCES . '/library');
define('CONFIG_DIRECTORY_VIEWS', CONFIG_DIRECTORY_RESOURCES . '/views');
define('CONFIG_DIRECTORY_CONTROLLERS', CONFIG_DIRECTORY_RESOURCES . '/controllers');
define('CONFIG_DIRECTORY_BACKUPS', CONFIG_DIRECTORY_RESOURCES . '/backups');

 class Config
 {
   public static $directories = array(
      "resources" => CONFIG_DIRECTORY_RESOURCES,
       "root" => CONFIG_DIRECTORY_ROOT,
       "branch" => CONFIG_DIRECTORY_BRANCH,
       "templates" => CONFIG_DIRECTORY_TEMPLATES,
       "library" => CONFIG_DIRECTORY_LIBRARY,
       "views" => CONFIG_DIRECTORY_VIEWS,
       "controllers" => CONFIG_DIRECTORY_CONTROLLERS,
       "backups" => CONFIG_DIRECTORY_BACKUPS,
    );
  }

在声明类/对象变量/常量时不能调用函数。您也不能使用字符串连接。它相当有限

更新: 您可以使用以下变通方法(编写时花了一点时间),这有点难看,因为它需要定义两次常量:

<?php

define('CONFIG_DIRECTORY_RESOURCES', realpath(__DIR__));
define('CONFIG_DIRECTORY_ROOT', $_SERVER['DOCUMENT_ROOT']);
define('CONFIG_DIRECTORY_BRANCH', $_SERVER['DOCUMENT_ROOT'] . '/branch');
define('CONFIG_DIRECTORY_TEMPLATES', CONFIG_DIRECTORY_RESOURCES . '/templates');
define('CONFIG_DIRECTORY_LIBRARY', CONFIG_DIRECTORY_RESOURCES . '/library');
define('CONFIG_DIRECTORY_VIEWS', CONFIG_DIRECTORY_RESOURCES . '/views');
define('CONFIG_DIRECTORY_CONTROLLERS', CONFIG_DIRECTORY_RESOURCES . '/controllers');
define('CONFIG_DIRECTORY_BACKUPS', CONFIG_DIRECTORY_RESOURCES . '/backups');

 class Config
 {
   public static $directories = array(
      "resources" => CONFIG_DIRECTORY_RESOURCES,
       "root" => CONFIG_DIRECTORY_ROOT,
       "branch" => CONFIG_DIRECTORY_BRANCH,
       "templates" => CONFIG_DIRECTORY_TEMPLATES,
       "library" => CONFIG_DIRECTORY_LIBRARY,
       "views" => CONFIG_DIRECTORY_VIEWS,
       "controllers" => CONFIG_DIRECTORY_CONTROLLERS,
       "backups" => CONFIG_DIRECTORY_BACKUPS,
    );
  }

引用PHP手册:

此[property]声明可能包括初始化,但 初始化必须是常量 值——也就是说,它必须能够 在编译时计算,并且不能 依赖于中的运行时信息 要评估的订单


您可以定义一个空数组,然后在运行时调用一个方法来填充它,或者调用一个单例类来初始化构造函数中的数组值,引用PHP手册:

此[property]声明可能包括初始化,但 初始化必须是常量 值——也就是说,它必须能够 在编译时计算,并且不能 依赖于中的运行时信息 要评估的订单


您可以定义一个空数组,然后在运行时调用一个方法来填充它,或者调用一个单例类来初始化构造函数中的数组值。

除了直接文本和已定义的常量之外,您不能将静态成员初始化为任何其他类型。不过,您可以使用类似的方法:

<?php
class Config 
{
    static protected $directories = null;

    static public function getDirectory($dirName)
    {
        if (self::$directories == null)
        {
            self::$directories = array(
                "resources" => realpath(__DIR__),
                "root" => $_SERVER['DOCUMENT_ROOT'],
                "branch" => $_SERVER['DOCUMENT_ROOT'] . "/branch",
                "templates" => realpath(__DIR__ . '/templates'),
                "library" => realpath(__DIR__ . '/library'),
                "views" => realpath(__DIR__ . '/views'),
                "controllers" => realpath(__DIR__ . '/controllers'),
                "backups" => realpath(__DIR__ . '/backups')
            );
        }
        return self::$directories[$dirName];
    }
}
#EOF

除了直接文本和已定义的常量之外,不能将静态成员初始化为任何对象。不过,您可以使用类似的方法:

<?php
class Config 
{
    static protected $directories = null;

    static public function getDirectory($dirName)
    {
        if (self::$directories == null)
        {
            self::$directories = array(
                "resources" => realpath(__DIR__),
                "root" => $_SERVER['DOCUMENT_ROOT'],
                "branch" => $_SERVER['DOCUMENT_ROOT'] . "/branch",
                "templates" => realpath(__DIR__ . '/templates'),
                "library" => realpath(__DIR__ . '/library'),
                "views" => realpath(__DIR__ . '/views'),
                "controllers" => realpath(__DIR__ . '/controllers'),
                "backups" => realpath(__DIR__ . '/backups')
            );
        }
        return self::$directories[$dirName];
    }
}
#EOF

为什么要引入对象的开销?注册表有它们的位置,但它们是常量的主要候选对象,所以为什么不定义它们呢?

为什么要引入对象的开销?注册表有它们的位置,但它们是常量的主要候选对象,所以为什么不直接定义它们呢?

MyIDE(netbeans)对此表示不满。抱怨语法错误。问题是使用函数定义属性的值。@mark:是的,我已经困得睡不着了,以至于没有注意到=>该睡觉了!我的IDE(netbeans)对此表示不满。抱怨语法错误。问题是使用函数定义属性的值。@mark:是的,我已经困得睡不着了,以至于没有注意到=>该睡觉了!这看起来是一个干净的解决方案。有什么不好的地方吗?调用一个方法(并进行检查)而不是访问一个静态属性可能会有一些开销,但我可以保证你永远不会注意到它。除非你开始什么都不做,而是在循环中访问配置数百万次。这看起来是一个干净的解决方案。有什么不好的地方吗?调用一个方法(并进行检查)而不是访问一个静态属性可能会有一些开销,但我可以保证你永远不会注意到它。除非你开始什么都不做,而是在循环中访问配置数百万次。不污染全局范围并强制执行不变性?不污染全局范围并强制执行不变性?问题是我可以在运行时更改“常量”。它还用一组常量污染了全局范围,而这些常量与全局可用性无关。问题是,我可以在运行时更改“常量”。它还通过一组常量污染了全局范围,这些常量没有业务可供全局使用