#php
#php
Вопрос:
То, что я пытаюсь решить, это плохая практика создания экземпляра класса, подобного
new Classname();
Поскольку мне нужно запустить classes __construct, но мне не нужно использовать класс после этого. поскольку другие функции внутри класса будут вызываться из __construct .
Комментарии:
1. Почему вы хотите это сделать? Звучит почти так, как будто вы устанавливаете значения по умолчанию для синглтона..
2. Единственной обязанностью конструктора является подготовка объекта к использованию. Он не должен делать ничего сверх этого и не должен иметь побочных эффектов. Действительно, это плохая практика — помещать все поведение объекта в конструктор. Конечно, есть исключения, но если вашему классу не нужен деструктор, значит, вы не достигли такого исключения.
Ответ №1:
Это сработало бы, но, как человек, поддерживающий ваш код, я был бы очень смущен этим. Как правило, простое создание экземпляра объекта не имеет побочных эффектов, поэтому я бы предположил, что я мог бы просто удалить эту строку, и все по-прежнему работало бы нормально.
Я бы рекомендовал пересмотреть структуру вашего кода, поскольку включение кода с побочными эффектами в __construct
определенно не является стандартным.
Комментарии:
1. То, что класс выполняет при чистом вводе в глобальной области видимости, так что на самом деле ему не нужна переменная.. Так стоит ли все еще просто помещать переменную туда любым способом?
2. Крис, просто для большей понятности.
3. @Chris R, лучшим решением будет что-то вроде
$input = new InputFilter($_POST)
, а затем использовать$input['foo']
вместо$_POST['foo']
. Если не используется$_POST
, у вас может получиться что-то вроде$globalfoo = new InputFilter($globalfoo)
. Использование глобальных переменных внутри функций (global
ключевое слово) само по себе почти всегда является плохой практикой.
Ответ №2:
Рассмотрите возможность использования чего-то подобного вместо этого:
class Foo
{
public static function do_something()
{
// ...
}
}
Foo::do_something();
Хотя то, что у вас есть, будет работать, неясно, должно ли что-то произойти.
(Если вы настаиваете на использовании объекта подобным образом, по крайней мере, четко документируйте это всякий раз, когда вы это делаете.)
Комментарии:
1. Это также возможно и может быть больше, чем с некоторой переменной. Как кажется, ваш код здесь более функционален, чем ООП, если вы переместите свою логику в __construct .
Ответ №3:
Хорошо, давайте просто скажем, что у нас есть classname с именем HelloWorld в файле.
Файл class.HelloWorld.php
class HelloWorld {
function __construct()
{
}
public function doSomething(){
echo "new HelloWorld()->doSomething() was called";
}
public function anotherMethod(){
echo "new HelloWorld()->anotherMethod() was called";
}
}
Теперь вы можете создать экземпляр класса во время выполнения, не сохраняя его в переменной.
require('class.HelloWorld.php');
// you can just instantiate it and the constructur will be called automatically
(new HelloWorld());
// or you can instantiate it and call other methods
(new HelloWorld())->doSomething();
Я не уверен, удалит ли сборщик мусора созданные классы или нет, но я предполагаю, что, поскольку эти классы не сохраняются в переменной, это не было бы сохранено где-то в памяти, и это было бы идеально.