PHP: Могут ли значения атрибутов в одном классе быть переданы атрибутам в другом классе с таким же именем? - PullRequest
0 голосов
/ 22 октября 2019

Я случайно создаю свой собственный фреймворк. (Прежде чем начать, пожалуйста, посмотрите PS в конце!)

Так, например, у меня есть:

class MessageSchedule
{
  use Utility;
  protected $messageScheduleID;
  protected $messageScheduleName;
  ...
  protected $minDaysPerWeek = 7;
  protected $maxDaysPerWeek = 3;
  protected $currentTimeZone = "Pacific/Honolulu";
}

class MessageSendList
{
  use Utility;
  protected $messageSendListID = NULL;
  protected $messageScheduleID = NULL;
  protected $messageScheduleName = NULL;
  ...
  protected $currentTimeZone = NULL;
}

Все таблицы в базе данных имеют зеркальные классы с ТОЧНО одинаковыми именами для переменных и атрибутов. Теперь в моих чертах Utility у меня есть функции для выполнения CRUD и чтения экземпляра объекта в скрипт в виде массива ключ / значение, который я затем могу extract.

Используя вычисленные имена атрибутов любого класса, я могу быстро (и очень грязно) заполнить объект с помощью цикла foreach, реализующего сортировку ...

$thisThing = new Thing;
$thisThing -> setThisValue = $thisValue;
... etc

Я могу сделать это таким образом, НО было бы менее подвержено ошибкам, если бы я мог просто сортировать функцию «клонировать, если есть атрибуты» в PHP. Сортировка:

$thisFoo = new Foo;
$thisBar = new Bar;
$thisOne = $thisFoo->doCreat(12); //Instantiates Foo with values from FooID=12
$thisBar = partialClone($thisOne); // If PHP had a partial clone! That is what I am looking for.

В моем случае он скопировал бы значения $messageScheduleID $messageScheduleName and $timeZone в новый экземпляр MessageSendList.

Надеюсь, что это смутно понятно.

Спасибо. Стив

... Позже: это то, что я сейчас использую и пытаюсь заменить.

$thisSendList = new MessageSendList();
$vars = $thisSendList->classAttributes();//Generic find attribute name
foreach ($vars as $var)
{
  if (isset($$var))
  {
    $thisSendList -> doSet($var, $$var); // Generic set attributes
  }
}
$thisSendList -> doCreate();

PS ОК, я ЗНАЮ , что я ДОЛЖЕН использовать Laravel или что-то подобное, но кривая обучения там довольно крутая. Я уже должен использовать jQuery, PHP, SQL, HTML, CSS, phpStorm (почти сам по себе язык программирования) и т. Д. И т. Д.

Я довольно хороший (очень медленный) программист, и я могу кодировать что угодно икак только я это сделаю, я это понимаю. Однажды я, вероятно, перееду в Ларавел, но на данный момент это слишком далеко для меня ... и я знаю, что кто-то все равно скажет: "Почему бы не использовать Yi" или что-то еще. Мне 64 года, памяти нет (слишком много конопли), так что ...

1 Ответ

1 голос
/ 22 октября 2019

Вы можете использовать ReflectionClass, чтобы получить массив открытых свойств, чем использовать array_intersect этих массивов, чтобы получить список свойств, которые вы должны скопировать.

function getPropertyList($object)
{
    $reflection = new ReflectionClass($object);
    $properties = $reflection->getProperties(ReflectionProperty::IS_PUBLIC);
    $result = [];
    foreach ($properties as $property) {
        $result[] = $property->getName();
    }
    return $result;
}

$thisFoo = new Foo;
$thisBar = new Bar;
$thisOne = $thisFoo->doCreat(12); //Instantiates Foo with values from FooID=12
$propsFoo = getPropertyList($thisOne);
$propsBar = getPropertyList($thisBar);
$common = array_intersect($propsFoo, $propsBar);
foreach ($common as $property) {
    $thisBar->$property = $thisOne->$property;
}

Вы можете превратить эту функциональность в чертукоторые вы будете использовать в классах, где вам это нужно.

Ресурсы:

...