Непонятность с __call

green-84

Новичок
Непонятность с __call

<?php

abstract class parentClass {
function __call($methodName, $methodParameters){
return new $methodName($methodParameters);
//return new $methodName($methodParameters[0]);
}
}

abstract class childClass extends parentClass {
}

class MyClass extends childClass {
function __construct() {
$arguments = func_get_args();
echo "MyClass construct parameters: "; print_r($arguments); echo "<br />";
$this->YourClass(1, 2, 3);
}
}

class YourClass extends childClass {
function __construct() {
$arguments = func_get_args();
echo "YourClass construct parameters: "; print_r($arguments); echo "<br />";
}
}

$MyObject = new MyClass(1, 2, 3);

?>


Выводит:

MyClass construct parameters: Array ( [0] => 1 [1] => 2 [2] => 3 )
YourClass construct parameters: Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 ) )

Кто может объяснить, почему MyClass construct parameters отличны от YourClass construct parameters?
 

Wicked

Новичок
потому что реально у тебя идут вызовы
new MyClass(1, 2, 3);
new YourClass(array(1, 2, 3));

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

А если на чистоту, то ты чем-то странным занимаешься. Настоящие мачо так не пишут :)
 

green-84

Новичок
Автор оригинала: Wicked
потому что реально у тебя идут вызовы
new MyClass(1, 2, 3);
new YourClass(array(1, 2, 3));

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

А если на чистоту, то ты чем-то странным занимаешься. Настоящие мачо так не пишут :)
1. Спасибо за ответ. Но только непонятно, почему "в __call аргументы оборачиваются в еще один массив".
2. Ничего странного нет - почитай "PHP 5 для профессионалов" - тогда, возможно, изменишь свое мнение насчет "настоящих мачо" :)
 

Wicked

Новичок
Да потому что "The $name parameter used is the name as the function name that was requested to be used. The arguments that were passed in the function will be defined as an array in the $arguments parameter." (c) manual
 

green-84

Новичок
Автор оригинала: Wicked
Да потому что "The $name parameter used is the name as the function name that was requested to be used. The arguments that were passed in the function will be defined as an array in the $arguments parameter." (c) manual
Вот это обоснованный ответ - спасибо, добрый человек :)
 

Alexandre

PHPПенсионер
Ничего странного нет - почитай "PHP 5 для профессионалов" - тогда, возможно, изменишь свое мнение насчет "настоящих мачо"
мне кажется, что у Wicked достаточно опыта для написания книги, получше чем банальная "PHP 5 для профессионалов"

указывая книгу, хорошо бы еще указать и авторов, а то яндекс мне выдал минимум три книги, с таким наименованием.
 

green-84

Новичок
Автор оригинала: Alexandre
мне кажется, что у Wicked достаточно опыта для написания книги, получше чем банальная "PHP 5 для профессионалов"

указывая книгу, хорошо бы еще указать и авторов, а то яндекс мне выдал минимум три книги, с таким наименованием.
PHP 5 для профессионалов, Эд Леки-Томпсон и еще несколько авторов. Не самая крутая книга, но лично я нашел много интересночного для себя.
 
Сверху