2014-01-10 27 views
1

的多個實例,我也有類似的這種創建splFileObject

class x { 
    function __construct($file){ 
    $this->readData = new splFileObject($file); 
} 

function a(){ 
    //do something with $this->readData; 
} 

function b(){ 
    //do something with $this->readData; 
} 
} 

$o = new x('example.txt'); 
echo $o->a(); //this works 
echo $o->b(); //this does not work. 

看來,如果這曾經方法首先只叫工作,如果他們被稱爲僅一起被稱爲將工作的第方法的類。我認爲這個問題與我不瞭解new對象如何構建有關。

+0

這些不是單獨的實例,你只有一個'x'的實例,你調用'$ o' ...至於爲什麼第二種方法不起作用,不知道什麼時候不知道是什麼意思方法做,什麼「不起作用」實際上意味着 –

+0

@MarkBaker我正在讀取函數中的txt文件並返回數據。所以,它不起作用,如果我同時調用兩者,它不會返回預期的數據。 – user2679413

+0

這並沒有真正地告訴我多少....但我懷疑第二種方法不會在第一種方法通過文件讀完文件後將文件指針倒回到文件開頭 –

回答

0

構造被加載到類的實例中。而且你只實例化一次。並訪問兩次。是不同的行動。如果你想讀取總是被採用的文件,應該創建一個讀取該文件的方法,並在其他所有觸發器中引用此方法。

我測試了你的代碼,它工作正常。我相信它應該查看日誌並查看是否有任何錯誤出現。如果文件不存在,您的代碼將停止。
找到這個錯誤在你的Apache日誌:

PHP Fatal error: Uncaught exception 'RuntimeException' with message 'SplFileObject::__construct(example.txt): failed to open stream

回答您的意見,這可能是一個辦法:

<?php 
class x { 

private $defaultFile = "example.txt"; 

private function readDefaultFile(){ 
    $file = $this->defaultFile; 
    return new splFileObject($file); 
} 

function a(){ 
    $content = $this->readDefaultFile(); 
    return $content ; 
} 

function b(){ 
    $content = $this->readDefaultFile(); 
    return $content ; 
} 

} 

$o = new x(); 
echo $o->a(); 
echo $o->b(); 

這兩種方法都將返回一個對象splFile。

+0

我想你可能是對的。我想,每當一個函數調用構造函數的屬性時,'new'關鍵字就會創建一個新的類實例。你能給我一個關於如何閱讀文件並讓其他人可以訪問的例子嗎?我可以做到,但我想看看是否有更好的方法來做到這一點。 – user2679413

+0

更新我的答案。只是一個想法。 –

+0

謝謝。我會看看。 – user2679413