Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Я получу те же результаты?
Не совсем. Я не знаю об обходном пути для 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
Если метод этого кода не является статическим, вы можете получить обход в 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"
clone
, а просто путем повторного создания и установки свойств. $copy = new static(); $copy->set($this->get()); return $copy;
– Marius Balčytis
2 November 2012 в 03:27
self::
или static::
будет влиять на то, используется ли базовый класс или подкласс этого статического метода. В отсутствие какой-либо причины думать, что такая ситуация, по сути, указывает на плохую практику (и я не вижу причин, почему это так), выбор между self::
и static::
статические методы, как в статических методах. Я неправильно понял ваш комментарий, или один из нас просто ошибается?
– Mark Amery
20 February 2014 в 19:34
get_called_class()
, что фактически совпадает с__CLASS__
, но совместимо с LSB. – shadowhand 5 March 2011 в 01:13