У меня есть файл PHP, в котором в верхней части я создаю дескриптор файла, используя fopen()
, Затем у файла есть пара классов, в функциях которых я пишу вещи в этот текстовый файл. И, в конце концов, в конце, то есть когда я закончу писать что-то в этот файл, я должен закрыть этот дескриптор файла, используя fclose()
,
Поток управления таков, что в следующем псевдокоде функция a_b()
класса A
называется LAST OF ALL в этом сценарии PHP. Так что, естественно, в конце тела a_b()
Я решил написать fclose($fileHandle);
.
НО я получил ОШИБКУ: Примечание: неопределенная переменная: fileHandle в C: \ xampp \ htdocs \ Tests \ Test.php в строке 15
Вопрос почему? Где я должен написать заявление fclose($fileHandle)
? Должен ли я написать это в самом конце файла?
<?php
$fileHandle = fopen($pathToFileHandle, "a");
class A {
function a_a() {
...
fwrite($fileHandle, "blahBlahBlah");
}
function a_b() {
...
fwrite($fileHandle, "Whatever");
...
fclose($fileHandle);
}
}
class L {
function l_a() {
...
fwrite($fileHandle, "Some text");
...
}
}
?>
Наличие встроенного кода (то есть кода, который делает что-то, скорее код, который определяет что-то, что будет вызвано позже), смешанного в том же файле, считается плохой вещью — не в последнюю очередь потому, что это порождает проблему, которую вы здесь описываете.
Вам не нужно явно закрывать дескриптор файла — PHP сделает это автоматически при выходе из скрипта.
Если вы хотите сделать больше, чем просто закрыть файл, альтернативой явному вызову закрытия в вашем потоке выполнения является запрос PHP вызывать функцию, когда скрипт завершает выполнение (обратите внимание, что обратный вызов также может быть объектом — то есть со связанными данными).
Как указывает Рене, ваша проблема возникает из области видимости. Однако также плохой дизайн для разделения файловых операций на два разных класса и процедурный побочный эффект. Используйте один класс для определения всех файловых операций (открытие, закрытие, чтение, запись). Затем передайте ссылку на этот класс другим классам, которые будут предоставлять или запрашивать данные в / из файла.
Неопределенная переменная: fileHandle в C: \ xampp \ htdocs \ Tests \ Test.php в строке 15
Функции PHP не могут получить доступ к глобальным переменным по умолчанию. Так:
$value = 'hello world';
class A {
public function b () {
return $value;
}
}
…не работает-$value
недоступен в функции.
Использовать global
ключевое слово, чтобы сделать глобальные переменные доступными внутри функции:
$value = 'hello world';
class A {
public function b () {
global $value;
return $value;
}
}
Но, как предположили комментаторы, по возможности лучше сохранить $fileHandle
переменная в классе, который использует его и закрыть дескриптор как можно скорее.