Как это исправить? - переменная содержит что-то еще, чем должно быть

0

Вчера я закончил строительство класса, в котором я использую метод __call (описанный несколько дней назад). Но он работает правильно, пока я не использую метод __call.

Его весь код

public function __call($Function, array $Parameters)
{
    if(method_exists($this, $Function))
    {
        call_user_func_array(array($this, $Name), $Parameters);
    }
    else
    {
        try
        {
            if(!preg_match('/[A-Za-z]_Style|Attribute/i', $Function))
            {
                throw new MarC_Exception(...);
            }
        }
        catch(MarC_Exception $Exception)
        {
            $Exception -> ExceptionWarning(...);
        }

        $Function = explode('_', $Function);
        $Function[0] = strtolower($Function[0]);

        ...

        $Options = array('Style', 'Attribute');

        if($Function[1] == $Options[0])
        {
            if(strtolower($Function[0]) == $this -> Elements['top'])
            {
                array_unshift($Parameters, $Function[0]);
                call_user_func_array(array($this, 'Set_AllElementStyles'), $Parameters);
            }
            else
            {
                if($this -> Check_StyleName($Parameters[0]))
                {
                    array_unshift($Parameters, $Function[0]);
                    call_user_func_array(array($this, 'Set_AllElementStyles'), $Parameters);
                }
            }
        }
        else
        {
            if(strtolower($Function[0]) == $this -> Elements['top'])
            {
                array_unshift($Parameters, $Function[0]);
                call_user_func_array(array($this, 'Set_AllElementAttributes'), $Parameters);
            }
            else
            {
                if($this -> Check_AttributeName($Parameters[0]))
                {
                    array_unshift($Parameters, $Function[0]);
                    call_user_func_array(array($this, 'Set_AllElementAttributes'), $Parameters);
                }
            }
        }
    }
}

но проблема (в это время) в использовании preg_match. Там он видит (я не знаю почему), что содержимое переменной функции - это Set_AllElementStyles (который я вызываю ниже в call_user_func_array) вместо (например) Body_Style.

Если место в коде echo $Function чтобы увидеть, что на самом деле происходит, оно вызывает

  • Body_style если он находится в начале функционального кода или внутри if-ветки if-else
  • Body_Style и Set_AllElementStyles если он находится внутри else-ветки if-else

Где я сделал ошибку, которая вызывает эту проблему? (Как это исправить?)

Редактировать 1: Пример объекта класса RootAssembler_Html (это окончательное покрытие абстрактного класса UniqueAssembler) вместе с использованием __call.

$VMaX = new MarC\RootAssembler_Html();
$VMaX -> Set_ExportWay();
$VMaX -> Set_Content();
$VMaX -> Set_Content($Text);
$VMaX -> Body_Style('background-color', '#ABCDEF');
$VMaX -> Body_Attribute('id', 'test');
$VMaX -> Execute();

Вывод:

<html>
    <head>
    /* some text that is not set in the first usage of method Set_Content */
    </head>
    <body id='test' style="background-color: #ABCDEF;">
    /* some text that was set in the second usage of method Set_Content */
    </body>
</html>
  • 0
    я думаю, что вы должны предоставить какой-то более короткий фрагмент рабочего кода, чтобы нам было легче увидеть, в чем проблема - а также вы бы показали нам, что пытались отладить ... Кстати. знаете ли вы, что ваш regex / [az] _Style | Attribute / i соответствует: либо слово «Attribute», либо буква, за которой следуют «_» и «Style»?
  • 0
    @JanLegner: Проблема не в регулярном выражении, сама по себе (даже если она может ошибаться). Проблема в том, что Set_AllElementStyles не должны появляться там.
Показать ещё 2 комментария
Теги:

1 ответ

1
Лучший ответ

Я уверен, что ваша проблема связана с этой строкой:

call_user_func_array(array($this, $Name), $Parameters)

Попробуйте изменить его на:

call_user_func_array(array($this, $Function), $Parameters)

и должен работать.

Потому что я не вижу, где определена переменная $Name. Он должен быть передан в качестве параметра функции или быть глобальным. Но в обоих случаях я не вижу, какой смысл проходить там.

Далее я предлагаю вам изменить свое регулярное выражение следующим образом и выбор типа ot html-элемента, который вы хотите установить для атрибута или стиля:

preg_match('/([A-Za-z]+)_(Style|Attribute)/i', $Function, $matches)

Вот пример ввода:

preg_match('/([A-Za-z]+)_(Style|Attribute)/i', "Body_Style", $matches1);
preg_match('/([A-Za-z]+)_(Style|Attribute)/i', "Div_Style", $matches2);
preg_match('/([A-Za-z]+)_(Style|Attribute)/i', "Div_Attribute", $matches3);

и выход:

Array
(
    [0] => Body_Style
    [1] => Body
    [2] => Style
)
Array
(
    [0] => Div_Style
    [1] => Div
    [2] => Style
)
Array
(
    [0] => Div_Attribute
    [1] => Div
    [2] => Attribute
)

Надеюсь это поможет!

  • 0
    Использование $Name вместо $Function в коде выше - я знаю, что должен быть $Function . И в моем коде это было правильно. Наконец, проблема исчезла после того, как я изменил использование call_user_func_array на классический вызов этих функций (кроме Set_AllElementsStyles у меня там, конечно, также Set_AllElementsAttributes). Ой, в настоящее время я нашел следующую ошибку, которую я имел там.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню