Экземпляр класса без переменной

#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();
  

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