Вчера я закончил строительство класса, в котором я использую метод __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-elseBody_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>
Я уверен, что ваша проблема связана с этой строкой:
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
)
Надеюсь это поможет!
$Name
вместо $Function
в коде выше - я знаю, что должен быть $Function
. И в моем коде это было правильно. Наконец, проблема исчезла после того, как я изменил использование call_user_func_array на классический вызов этих функций (кроме Set_AllElementsStyles у меня там, конечно, также Set_AllElementsAttributes). Ой, в настоящее время я нашел следующую ошибку, которую я имел там.
Set_AllElementStyles
не должны появляться там.