Множественное наследование в PHP 7 (Наследование диам.) [Дубликат]

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

Пример:

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
14
задан OM The Eternity 22 April 2010 в 13:54
поделиться

3 ответа

Множественное наследование страдает от проблемы Diamond , которая еще не была (согласована с тем, как быть) в PHP. Таким образом, на PHP не существует множественного наследования.

    BaseClass
       /\
      /  \
 ClassA  ClassB
      \  /
       \/
     ClassC

Если оба ClassA и ClassB определили свой собственный метод foo(), который вы бы назвали в ClassC?

Вам рекомендуется либо использовать структуру объекта , либо интерфейсы (которые допускают множественное наследование), либо - если вы после повторного использования по горизонтали - посмотрите на Decorator или Strategy до тех пор, пока у нас не будут Черты (или Прививки или что бы они там ни назывались).

Некоторая ссылка:

37
ответ дан Gordon 26 August 2018 в 13:08
поделиться

Нет, PHP не поддерживает множественное наследование.

Чтобы разрешить эту функцию в PHP, вы можете использовать интерфейсы, или вы можете использовать «Черты» вместо классов.

PHP 5.4.0 поставляется с чертами, которые будут выполнять множественное ограничение наследования , Подробнее о признаках см. Ниже:

http://php.net/manual/en/language.oop5.traits.php

1
ответ дан Homesh Paul 26 August 2018 в 13:08
поделиться

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 .

Посмотрите Горизонтальное повторное использование для PHP

3
ответ дан mega6382 26 August 2018 в 13:08
поделиться
  • 1
    PLs разрабатывают, я не понимал, о чем говорим ... – OM The Eternity 22 April 2010 в 14:07
  • 2
    Какой момент? Точка is_a? Или делегация? – Ionuț G. Stan 22 April 2010 в 14:08
  • 3
    Оба, пожалуйста, уточняйте. Точка, я новый код, не знакомый с этими понятиями – OM The Eternity 22 April 2010 в 14:11
Другие вопросы по тегам:

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