2014-07-03 34 views
3

我在寫一個非常簡單的PHP應用程序,它稍微修改後返回文件的路徑。__DIR__在類中的用法

這是我的代碼:

<?php 
class abc { 

private $path = __DIR__ . DIRECTORY_SEPARATOR. 'moshe' . DIRECTORY_SEPARATOR; 

function doPath() { 
echo $this->path; 
} 

} 


$a = new abc(); 
$a->doPath(); 

我得到的錯誤:

PHP Parse error: syntax error, unexpected '.', expecting ',' or ';' in /mnt/storage/home/ufk/1.php on line 4 

Parse error: syntax error, unexpected '.', expecting ',' or ';' in /mnt/storage/home/ufk/1.php on line 4 

由於某種原因,我不能添加使用連接__DIR__ ''到另一個字符串。我錯過了什麼?

使用PHP 5.5.13。

+3

你想要做的是一個不好的做法,稱爲**緊耦合**。如果你以後必須改變路徑怎麼辦?你會修改代碼! – Yang

+0

那我應該怎麼做呢? – ufk

+0

相反,你應該傳遞一個路徑作爲參數,像這樣'public function __construct($ path){$ this-> path = $ path; }'然後'新的abs(__ DIR__。'/ moshe /');' – Yang

回答

8

您不能定義類的字段dinamycally

private $a = 5 + 4; // wont work, has to be evaluated 
private $a = 9; // works,because static value 

您的解決方案:

class abs{ 
    private $path; 
    public function __construct(){ 
    $this->path = __DIR__ . DIRECTORY_SEPARATOR. 'moshe' . DIRECTORY_SEPARATOR; 
    } 
} 
+1

可能在更新的版本...但我認爲它只有5.6 ... –

+0

@NiettheDarkAbsol有趣,你有參考? –

+3

[常量標量表達式](http://www.php.net/manual/en/migration56.new-features.php) –

2

You can't calculate properties in their class definition

如果您需要將變量初始化爲只能由表達式確定的默認值,則可以使用構造函數來完成。

public function __construct() 
{ 
    $this -> path = __DIR__ . DIRECTORY_SEPARATOR. 'moshe' . DIRECTORY_SEPARATOR; 
} 

但是,上述是一個非常糟糕的設計,由於各種原因,我不會在這裏進入。作爲一個論點,你走得更好,因爲這會讓你有更大的靈活性。例如,如果您想測試該類,則可以在測試該類時將其寫入其他位置,而不影響實時數據。

public function __construct ($path) 
{ 
    if (!is_dir ($path)) { 
     // Throwing an exception here will abort object creation 
     throw new InvalidArgumentException ("The given path '$path' is not a valid directory"); 
    } 

    $this -> path = $path; 
} 
+0

是的,這是答案,這個答案應該被提高和接受。但你遲到了,這是時間問題。 – Yang