【问题标题】:Can I use dirname(__FILE__) as a part of a string?我可以使用 dirname(__FILE__) 作为字符串的一部分吗?
【发布时间】:2013-09-24 12:36:50
【问题描述】:

我在 php 脚本中包含 dirname(__FILE__),但前几天我将它作为字符串的一部分包含在内,它导致了错误。有什么想法吗?

这条线是

private $errorfile = dirname(__FILE__).'/../../../error_logs/error.log';

private $errorfile = '/../../../error_logs/error.log';
error_log($message,3, dirname(__FILE__).$this->errorfile);

它导致了一个错误,例如

PHP 解析错误:语法错误,在 /home2/futsalti/public_html/_futsal-time-v4.9/public/scripts/php/databaseClass.php 中出现意外的 '('、期待 ',' 或 ';'

PHP 解析错误:语法错误,意外的 ';'在/home2/futsalti/public_html/_futsal-time-v4.9/public/scripts/php/databaseClass.php

编辑:

好的,刚来找我...也许问题应该是我可以在课堂上使用dirname(__FILE__) 吗?

【问题讨论】:

  • 注意:在 PHP 5.3 及更高版本中,您可以使用__DIR__ 代替dirname(__FILE__)
  • 我会使用dirname($_SERVER['DOCUMENT_ROOT']),这样你就可以避开所有../../../..

标签: php


【解决方案1】:

属性默认值必须是一个固定的常数值;您不能在属性的默认值中使用动态值、变量、串联字符串或函数调用。

可以使用常量,正如我之前在上面的评论中指出的,__DIR__dirname(__FILE__) 的有效替代品。

因此,您可以这样做:

class myClass {
    public $path = __DIR__;
}

这行得通,但你不能在初始声明中添加任何其他内容,所以虽然它越来越接近,但它并没有真正回答你的问题。

如果它需要更多,您需要在代码中定义它而不是默认值。我建议在属性声明中将变量声明为空字符串或 null,并使用您的 __construct() 函数根据需要填充值。

class myClass {
    public $errorFile = null;
    public function __construct() {
         $this->errorFile = __DIR__ . ''/../../../error_logs/error.log';
    }
}

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    是的,您可以在类中使用dirname(__FILE__),但不能直接使用。在使用该路径之前调用的某个函数中将路径分配给$errorfile

    这个声明可能包含一个初始化,但是这个初始化必须是一个常量值——也就是说,它必须能够在编译时被评估,并且不能依赖于运行时信息才能被评估。 source

    【讨论】:

      【解决方案3】:

      您正在尝试将两个字符串连接在一起作为类中已定义属性的默认值。基本上你根本不能使用任何操作。

      例如,此代码会抛出您遇到的错误:

      class Foo() {
          private $bar = "string1"."string2";
      }
      

      这段代码也会抛出同样的错误:

      class Foo() {
          private $bar = 1+1;
      }
      

      此代码不会引发错误:

      class Foo() {
          private $bar = "string1string2";
      }
      

      可能的解决方法是创建一个返回错误日志的方法。

      class Foo() {
         function getThing() {
            return "string1"+"string2";
         }
      }
      

      【讨论】:

      • 字符串连接可以在类变量中使用
      【解决方案4】:

      是的,你可以在任何地方使用它,但你不能用它来设置类中属性的默认值。实际上,您通常不能使用任何功能。如果您想在每次实例化类时将其设置为默认值,则将其放在构造函数中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-11
        • 2011-12-04
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多