Как подключить все классы, а не перезаписывать главный последним подключённым

228
25 декабря 2017, 14:16

Есть например главный класс и классы которые его расширяют:

class mainClass {
    public static function some_function() {
        $obj = new mainClass();
        $obj->property1 = 'Value of property1';
        $obj->property2 = 'Value of property2';
        return $obj;
    }
}
$mainObj = new mainClass();
class addedClass1 extends mainClass {
    public static function some_function() {
        $obj = mainClass::some_function();
        $obj->property1 = 'Overrided value of property1';
        return $obj;
    }
}
class addedClass2 extends mainClass {
    public static function some_function() {
        $obj = mainClass::some_function();
        $obj->property2 = 'Overrided value of property2';
        return $obj;
    }
}
$arrayOfClasses = ['addedClass1','addedClass2'];
foreach($arrayOfClasses as $class) {
    $mainObj = new $class();
}
echo $mainObj->some_function()->property1 .'<br>';
echo $mainObj->some_function()->property2;

В данном случае class addedClass2 как и нужно перезаписывает $obj->property2, но при этом addedClass1 больше не перезаписывает $obj->property1

Т.е. сейчас получаю:

Value of property1
Overrided value of property2

А нужно:

Overrided value of property1
Overrided value of property2

Как сделать чтобы все классы подключались и перезаписывали каждый свое отдельное свойство?

ps. addedClass'ы на самом деле будут подключаться все с отдельной директории, поэтому ни их названия, ни общее количество неизвестны, эти два только для примера

Answer 1

Проблема в том, что вы в цикле перезаписываете переменную $mainObj, и на выходе из цикла в ней сохраняется значение после последней итерации. Чтобы получить оба объекта, можно либо собирать их в массив в этом же цикле (вариант №1), либо объявить в классе статические свойства, и записывать в эти свойства необходимые значения (вариант №2) :

Вариант №1

class mainClass
{
    public static function some_function() {
        $obj = new mainClass();
        $obj->property1 = 'Value of property1';
        $obj->property2 = 'Value of property2';
        return $obj;
    }
}
class addedClass1 extends mainClass
{
    public static function some_function() {
        $obj = mainClass::some_function();
        $obj->property1 = 'Overrided value of property1';
        return $obj;
    }
}
class addedClass2 extends mainClass
{
    public static function some_function() {
        $obj = mainClass::some_function();
        $obj->property2 = 'Overrided value of property2';
        return $obj;
    }
}
$arrayOfClasses = ['addedClass1','addedClass2'];
foreach ($arrayOfClasses as $class) {
    $mainObj[] = new $class();
}
echo $mainObj[0]->some_function()->property1 .'<br>';
echo $mainObj[1]->some_function()->property2;
/*
Overrided value of property1
Overrided value of property2
*/

Вариант №2

class mainClass
{
    public static $property1;
    public static $property2;
    public static function some_function() {
        self::$property1 = 'Value of property1';
        self::$property2 = 'Value of property2';
    }
}
class addedClass1 extends mainClass
{
    public static function some_function() {
        mainClass::$property1 = 'Overrided value of property1';
    }
}
class addedClass2 extends mainClass
{
    public static function some_function() {
        mainClass::$property2 = 'Overrided value of property2';
    }
}
$arrayOfClasses = ['addedClass1', 'addedClass2'];
foreach ($arrayOfClasses as $class) {
    $class::some_function();
}
echo addedClass1::$property1 .'<br>';
echo addedClass1::$property2;
/*
Overrided value of property1
Overrided value of property2
*/
READ ALSO
Как передать список ссылок для парсинга в curl

Как передать список ссылок для парсинга в curl

Мне необходимо, чтобы сайты для парсинга брались с файлаtxt, но я не знаю можно ли это реализовать, а главное как правильно

248
шкала размеров на картинк

шкала размеров на картинк

[введите сюда описание ссылки][1]

168
Куда сохраняется значение введенное в input

Куда сохраняется значение введенное в input

Допустим я отправил форму из formphp на form

206