2014-01-10 22 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