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

Конструкция загружается в экземпляр класса. И вы создаете его только один раз. И доступ дважды. Это разные действия. Если вы хотите прочитать файл всегда, необходимо создать метод, который читает этот файл, и в рамках всего другого запускает этот метод.

Я проверил ваш код, и он работал нормально. Я считаю, что он должен смотреть журналы и видеть, появляется ли какая-либо ошибка. Если файл не существует, ваш код остановится.
поиск этой ошибки в логах апача:

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

Я думаю, вы можете быть правы. Я думал, что «новое» ключевое слово создает новые экземпляры класса каждый раз, когда функция вызывает свойство из конструктора. можете ли вы привести пример о том, как читать файл и сделать его доступным для других? Я могу это сделать, но я хочу посмотреть, есть ли лучший способ сделать это. – user2679413

+0

Обновите свой ответ. Просто идея. –

+0

Спасибо. Я это проверю. – user2679413