Как сравнить дочерний класс со значениями по умолчанию из вызова в базовом классе в PHP 5.2? - PullRequest
1 голос
/ 21 февраля 2012

Учитывая этот фрагмент кода:

<?
  class mcClassington
  {
        var $mcProperty='default';

        function mcDoSomething()
        {
               if($this->mcProperty == (/* new type of same class */)->mcProperty)
               {
                       sameBusiness();
               }
               else
               {
                       sortIt($this->mcProprety);
               }
        }
 }

Не уверен, как я могу запросить новый объект того типа, который есть у экземпляра $this.

Я пытаюсь написать эту функцию для базового класса, но пусть классы, которые выходят из него, проверяют свои собственные значения по умолчанию. Все, о чем я мог думать, это супергетто, использующее switch(get_class($this)), но это полностью разрушило бы динамическую цель кода, над которым я работаю.

РЕДАКТИРОВАТЬ : Итак, я не могу опубликовать полный реальный код. Лучшее, что я могу предоставить, - это статический пример использования, опубликованный ниже.

class displayObject //implements attachable
{
    public $layer = null;
    public $xPos = Array(
                        'left'=>null, 
                        'width'=>null,
                        'margin-left'=>null,
                        'margin-right'=>null,
                        'padding-left'=>null,
                        'padding-right'=>null
                    );
    public $yPos = Array(
                        'top'=>null,
                        'height'=>null,
                        'margin-top'=>null,
                        'margin-bottom'=>null,
                        'padding-top'=>null,
                        'padding-bottom'=>null
                    );
}


class Button extends displayObject
{
    public $link, $image, $backing;
    public $xPos = Array(
                        'left'=>null, 
                        'width'=>'120px',
                        'margin-left'=>'8px',
                        'margin-right'=>'8px',
                        'padding-left'=>null,
                        'padding-right'=>null
                    );
    public $yPos = Array(
                        'top'=>null,
                        'height'=>'108px',
                        'margin-top'=>'4px',
                        'margin-bottom'=>'4px',
                        'padding-top'=>null,
                        'padding-bottom'=>null
                    );
}

И затем, в других файлах люди могут использовать класс следующим образом:

$navBar = Array();  // Will hold basic Button Objects

$specialtyButton = new Button();
$specialtyButton->$xPos['width'] = '220px';
$specialtyButton->$yPos['height'] = '220px';
/*  and so on...    */

Функция, которую я пишу, должна вызываться из базового класса displayObject в формате myFunction($this); Я пытаюсь решить, сортировать ли псевдо-стили по разным местам в зависимости от того, совпадают они или нет. их значения по умолчанию.

Например, $ specialtyButton будет отсортирован специально, потому что его ширина и высота отличаются от значений по умолчанию для Button, но кнопки внутри $ navBar будут пропущены, поскольку ничего не было задано явно.

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Вы можете просто:

$myClassName = get_class($this);
$newObj = new $myClassName;
if ($this->mcProperty == $newObj->mcProperty) {
  // ...

... но я бы не стал. Я бы сказал, что было бы разумнее хранить значения по умолчанию в свойстве private, чтобы никто не мог их изменить и сравнить с ними. Создание новых экземпляров просто для проверки значения по умолчанию кажется мне ужасной вещью ...

1 голос
/ 21 февраля 2012

Я бы изменил ваш формат на что-то вроде этого:

class mcClassington
{
    private $mcProperty = array( 'value' => '', 'default' => 0);

    function mcDoSomething()
    {
        if($this->mcProperty['value'] == $this->mcProperty['default'])
        {
        }
    }
}

По сути, либо определите значение default как ключ массива внутри того же члена класса, либо создайте другой элемент класса для значения по умолчанию, например private $mcPropertyDefault;.

0 голосов
/ 21 февраля 2012

попробуйте использовать ключевое слово parent в вашем дочернем классе, который наследует пример объекта:

parent::xPos;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...