Есть например главный класс и классы которые его расширяют:
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'ы на самом деле будут подключаться все с отдельной директории, поэтому ни их названия, ни общее количество неизвестны, эти два только для примера
Проблема в том, что вы в цикле перезаписываете переменную $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
*/
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Мне необходимо, чтобы сайты для парсинга брались с файлаtxt, но я не знаю можно ли это реализовать, а главное как правильно