Где закрыть дескриптор файла, открытый в начале сценария PHP?

У меня есть файл 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");
...
}
}

?>

1

Решение

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

Вам не нужно явно закрывать дескриптор файла — PHP сделает это автоматически при выходе из скрипта.

Если вы хотите сделать больше, чем просто закрыть файл, альтернативой явному вызову закрытия в вашем потоке выполнения является запрос PHP вызывать функцию, когда скрипт завершает выполнение (обратите внимание, что обратный вызов также может быть объектом — то есть со связанными данными).

Как указывает Рене, ваша проблема возникает из области видимости. Однако также плохой дизайн для разделения файловых операций на два разных класса и процедурный побочный эффект. Используйте один класс для определения всех файловых операций (открытие, закрытие, чтение, запись). Затем передайте ссылку на этот класс другим классам, которые будут предоставлять или запрашивать данные в / из файла.

1

Другие решения

Неопределенная переменная: 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 переменная в классе, который использует его и закрыть дескриптор как можно скорее.

1

По вопросам рекламы [email protected]