construct () vs SameAsClassName () для конструктора в PHP



есть ли какие-либо преимущества в использовании __construct() вместо имени класса для конструктора в PHP?



пример (__construct):



class Foo {
function __construct(){
//do stuff
}
}


пример (название):



class Foo {
function Foo(){
//do stuff
}
}


имеющего __construct Метод (первый пример) возможен начиная с PHP 5.



наличие метода с тем же именем, что и класс в качестве конструктора (второй пример), возможно с версии PHP 4 до версии 7.

542   11  

11 ответов:

Я согласен с Гизмо, преимущество в том, что вам не нужно переименовывать его, если вы переименуете свой класс. СУХОЙ.

аналогично, если у вас есть дочерний класс можно назвать

parent::__construct()

для вызова родительского конструктора. Если далее по дорожке вы измените класс, наследуемый дочерним классом, вам не нужно менять вызов конструкции на родительский.

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

также обратите внимание, что

начиная с PHP 5.3.3, методы с тем же именем, что и последний элемент имени класса пространства имен, больше не будут рассматриваться как конструктор. Это изменение не влияет на классы без пространства имен.

Источник:http://php.net/manual/en/language.oop5.decon.php

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

из руководства PHP:

для обратной совместимости, если PHP 5 не может найти функцию _ _ construct () для данного класса, он будет искать функцию конструктора старого стиля по имени класса. Фактически это означает, что единственный случай, который будет иметь проблемы совместимости, - это если класс имеет метод с именем __construct () который использовался для разных семантик

Если вы находитесь на PHP5 я бы рекомендовал использовать __construct чтобы не заставлять PHP искать в другом месте.

главное преимущество, которое я вижу для _ _ construct, заключается в том, что вам не нужно переименовывать свой конструктор, если вы измените имя класса.

сегодня принятый ответ устарел.

переименование классов-это плохая практика: вы должны помнить, что и где переименовывать каждый раз при обновлении до новой версии. Иногда (например, с помощью отражение или сложная структура зависимости) это может быть невозможно без радикального рефакторинга. А это случайное сложности вы хотите, чтобы избежать. Вот почему пространства имен были введены в PHP. Java, C++ или C# не используют __construct, они используют названный конструктор и нет никаких проблем с ними.

начиная с PHP 5.3.3, методы с тем же именем, что и последний элемент a в пространстве имен имя класса больше не будут считаться конструкторами. Это изменение не влияет на классы без пространства имен.

пример

namespace Foo;
class Test {
  var $a = 3;

  function Test($a) {
    $this->a = $a;
  }

  function getA() {
    return $this->a;
  }
}

$test = new Test(4);
echo $test->getA(); // 3, Test is not a constructor, just ordinary function

обратите внимание, что именованные конструкторы не являются устаревшими (PHP 5.5 сегодня). Однако, вы не можете предсказать, что ваш класс не будет используется в пространстве имен __construct следует предпочесть.

разъяснение о плохой практике, упомянутой выше (для Дениса)

где-то в коде, вы могли бы использовать ReflectionClass:: getName (); при переименовании класса, вы должны помнить, где вы использовали отражение и проверить, если getName() результат по-прежнему согласован в вашем приложении. Чем больше вам нужно запомнить что-то конкретное, тем больше вероятность, что что-то есть забыли, что приводит к ошибкам в приложении.

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

нет причин переименовывать класс:

  • если имя класса конфликтует, используйте пространства имен
  • если ответственность класса смещается, вместо этого выводите какой-то другой класс

в классах PHP в пространстве имен метод с тем же именем следует избегать в любом случае: интуитивно он должен создавать объект, созданный классом; если он делает что-то еще, зачем давать ему то же имя? Это должен быть конструктор и ничего больше. Основная проблема заключается в том, что поведение такого метода зависит от пространства имен использование.

в PHP нет проблем с конструкторами __construct. Но это была не самая умная идея, чтобы изменить именованные конструкторы.

лучшее преимущество использования __contruct() вместо ClassName() при расширении классов. Гораздо проще позвонить parent::__construct() вместо parent::ClassName(), так как он повторно используется среди классов, и родитель может быть легко изменен.

в вашем примере Foo::Foo иногда называют PHP 4 или конструктор старого стиля, потому что он исходит из дней PHP 4:

class Foo {
    // PHP 4 constructor
    function Foo(){
        //do stuff
    }
}

PHP 4 конструкторы будут устарели, но не удалены в PHP 7. Они больше не будут рассматриваться как конструкторы в любой ситуации в PHP 8. Будущая совместимость, безусловно, является большой причиной, чтобы не использовать эту функцию.

в PHP 5 преимущество будет заключаться в том, что производительность будет лучше. Он будет искать конструктор по имени __construct во-первых, и если он этого не найдет, он будет искать конструкторы по имени className. Так что если он находит конструктор по имени __construct не нужно искать конструктор по имени className.

прошло уже несколько лет с тех пор, как этот вопрос был задан, но я думаю, что я должен ответить на этот вопрос еще, потому что все изменилось, и для читателей в будущем я хочу, чтобы информация была актуальной!


поэтому в php-7 они удалят возможность создать конструктор как функцию с тем же именем, что и класс. Если вы все еще делаете это, вы получите E_DEPRECATED.

вы можете узнать больше об этом предложении (предложение принято) здесь: https://wiki.php.net/rfc/remove_php4_constructors

и цитата оттуда:

PHP 7 будет излучать E_DEPRECATED всякий раз, когда a PHP 4 конструктор определен. Когда имя метода совпадает с именем класса, класс не находится в пространстве имен, а конструктор PHP 5 (__construct) отсутствует, тогда будет выдан E_DEPRECATED. PHP 8 перестанет испускать E_DEPRECATED и методы не будут распознаны как конструкторы.

также вы не получите E_STRICT в php-7 Если вы определяете метод с тем же именем, что и класс и A __construct().

вы можете посмотреть это здесь:

PHP 7 также прекратите излучать E_STRICT когда присутствует метод с тем же именем, что и класс, а также __construct.


поэтому я бы рекомендовал вы использовать __construct(), поскольку у вас будет меньше проблем с этим в будущем.

совместимость. Всегда есть шанс, что унаследованный код, оставленный на языке для обратной совместимости, будет удален в будущей версии.

Если есть методы __Construct и способ SameAsClassName тогда __строительство будет выполняться, способ SameAsClassName будут пропущены.

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

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

Comments

    Ничего не найдено.