Если мы рассмотрим общие сценарии, в которых может быть выбрано это исключение, доступ к свойствам с объектом вверху.
Пример:
string postalcode=Customer.Address.PostalCode;
//if customer or address is null , this will through exeption
здесь, если адрес равен нулю, то вы получите NullReferenceException.
Итак, в качестве практики мы всегда должны использовать проверку нуля, прежде чем обращаться к свойствам в таких объектах (особенно в общих)
string postalcode=Customer?.Address?.PostalCode;
//if customer or address is null , this will return null, without through a exception
Множественное наследование страдает от проблемы Diamond , которая еще не была (согласована с тем, как быть) в PHP. Таким образом, на PHP не существует множественного наследования.
BaseClass
/\
/ \
ClassA ClassB
\ /
\/
ClassC
Если оба ClassA
и ClassB
определили свой собственный метод foo()
, который вы бы назвали в ClassC
?
Вам рекомендуется либо использовать структуру объекта , либо интерфейсы (которые допускают множественное наследование), либо - если вы после повторного использования по горизонтали - посмотрите на Decorator или Strategy до тех пор, пока у нас не будут Черты (или Прививки или что бы они там ни назывались).
Некоторая ссылка:
Нет, PHP не поддерживает множественное наследование.
Чтобы разрешить эту функцию в PHP, вы можете использовать интерфейсы, или вы можете использовать «Черты» вместо классов.
PHP 5.4.0 поставляется с чертами, которые будут выполнять множественное ограничение наследования , Подробнее о признаках см. Ниже:
PHP не поддерживает множественное наследование как таковое, но он обеспечивает некоторую легкость повторного использования наборов методов в нескольких независимых классах, используя traits
. A trait
записывается точно так же, как класс, но он не может быть создан сам по себе.
ниже - это несколько примеров из руководства PHP:
Пример порядка прихода:
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
Выход:
Hello World!
Вот еще один пример разрешения конфликтов:
trait A {
public function smallTalk() {
echo 'a';
}
public function bigTalk() {
echo 'A';
}
}
trait B {
public function smallTalk() {
echo 'b';
}
public function bigTalk() {
echo 'B';
}
}
class Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
}
class Aliased_Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
B::bigTalk as talk;
}
}
Для получения дополнительной информации и более глубокого понимания множественного вхождения в PHP .