PHP :: поведение класса [дубликат]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

421
задан Mike 10 October 2015 в 00:44
поделиться

4 ответа

Я получу те же результаты?

Не совсем. Я не знаю об обходном пути для PHP 5.2.

В чем разница между new self и new static?

self относится к тому же классу, в котором действительно написано ключевое слово new.

static, в поздних статических привязках PHP 5.3, относится к любому классу в иерархии, которую вы назвали методом.

В следующем примере B наследует оба метода из A. Вызов self привязан к A, потому что он определен в реализации A первого метода, тогда как static привязан к вызываемому классу (также см. get_called_class() ) .

class A {
    public static function get_self() {
        return new self();
    }

    public static function get_static() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
716
ответ дан mleko 18 August 2018 в 06:32
поделиться
  • 1
    имеет смысл. Я считаю, что лучше всего передать имя класса функции, использующей позднюю статическую привязку, а затем вернуть новое $ className ($ options); – Mike 4 March 2011 в 19:25
  • 2
    Вам не нужно «проходить», имя класса, вы всегда можете сделать get_called_class(), что фактически совпадает с __CLASS__, но совместимо с LSB. – shadowhand 5 March 2011 в 01:13
  • 3
    get_called_class не существует в & lt; PHP5.3. Следовательно, если вы хотите получить имя класса объекта-объекта в PHP5.2, эта функция не помогает при попытке конвертировать библиотеку из PHP 5.3 в PHP 5.2 – txwikinger 21 September 2011 в 16:29
  • 4
    См. Ниже для get_class ($ this); – lucian303 11 October 2012 в 22:50
  • 5
    У меня подобная ситуация ... если вы хотите взглянуть на нее, я бы очень признателен ей. [Д0] stackoverflow.com/questions/22107831/… – Pepito Fernandez 3 March 2014 в 18:16

Если метод этого кода не является статическим, вы можете получить обход в 5.2 с помощью get_class($this).

class A {
    public function create1() {
        $class = get_class($this);
        return new $class();
    }
    public function create2() {
        return new static();
    }
}

class B extends A {

}

$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));

Результаты:

string(1) "B"
string(1) "B"
14
ответ дан stefanos gian 18 August 2018 в 06:32
поделиться
  • 1
    Если метод не является статическим, то поздние статические привязки становятся совершенно неактуальными. – BoltClock♦ 8 October 2012 в 21:33
  • 2
    Например, вы можете использовать его в "copy & quot; метод, где объект копируется без использования clone, а просто путем повторного создания и установки свойств. $copy = new static(); $copy->set($this->get()); return $copy; – Marius Balčytis 2 November 2012 в 03:27
  • 3
    @BoltClock Наверняка нет? Если вы вызываете переопределенный статический метод из метода экземпляра подкласса, то ваш выбор self:: или static:: будет влиять на то, используется ли базовый класс или подкласс этого статического метода. В отсутствие какой-либо причины думать, что такая ситуация, по сути, указывает на плохую практику (и я не вижу причин, почему это так), выбор между self:: и static:: статические методы, как в статических методах. Я неправильно понял ваш комментарий, или один из нас просто ошибается? – Mark Amery 20 February 2014 в 19:34
  • 4
    @Mark Amery: Хмм, я об этом не думал. Вы абсолютно правы. Я предположил, что никакие статические методы не будут вызваны в рассматриваемом методе экземпляра, но, основываясь на вашем примере, я вижу, как это будет очень наивное предположение. – BoltClock♦ 21 February 2014 в 06:42
  • 5
    Поздние статические привязки doc = & gt; php.net/manual/en/language.oop5.late-static-bindings.php – DevWL 3 November 2017 в 04:48
0
ответ дан FatalError 6 September 2018 в 20:24
поделиться
2
ответ дан FatalError 30 October 2018 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: