У меня два конструктора:
function clsUsagerEmailUserName($nickName, $email)
{
$this->nickName = $nickName;
$this->email = $email;
}
function clsUsagerEmailUserName($email)
{
$this->email = $email;
}
Но это не работает? Что не так, в этой версии PHP не должно быть объектно-ориентированного подхода? (Я просто перехожу с PHP4)






PHP5 не допускает перегруженного конструктора.
В качестве альтернативы вы можете использовать функцию для установки или использовать этот трюк (можно найти на EE):
function __construct ($var1, $var2 = null)
{
if (isset($var2))
{
//Do one thing
}
else
{
//Do another
}
}
Если у вас есть веская причина хранить аргументы функции в таком порядке, сделайте что-нибудь вроде этого:
function __construct()
{
switch ( func_num_args() ) {
case 1:
$this->email = func_get_arg(0);
break;
case 2:
$this->nickName = func_get_arg(0);
$this->email = func_get_arg(1);
break;
// [...]
default:
throw new Exception('Wrong number of values passed to constructor');
}
}
Я настоятельно рекомендую дать ответ Даока по этому поводу.
PHP поддерживает объектно-ориентированные конструкции в более новых версиях, но перегрузка функций не является частью объектно-ориентированной парадигмы.
Как уже было сказано кем-то другим, PHP не поддерживает функции перегрузки. В PHP вы можете определить «значения по умолчанию» для параметров функции. Ваша функция может выглядеть так, с вашим ожидаемым поведением:
function clsUsagerEmailUserName($nickName, $email = NULL)
{
if ($email <> NULL)
{
$this->nickName = $nickName;
$this->email = $eMail;
}
else
{
$this->email = $nickName;
}
}
Примечание путаница с именами переменных в примере выше! Лучшее использование этой «возможности» в PHP будет выглядеть так, но вам нужно будет обновить каждый вызов функции в вашем приложении:
function clsUsagerEmailUserName($email, $nickName = NULL)
{
$this->email = $email;
if ($nickName <> NULL)
$this->nickName = $nickName;
}
Для чистоты предпочитаю второй.
Вы можете использовать func_get_args для подсчета количества переданных аргументов, а затем сопоставить это с методом.
abstract class AlmostPolymorphicObject {
public function __construct() {
$args = func_get_args();
$argsCount = count($args);
$callback = array($this, '_construct'.$argsCount);
if (!is_callable($callback)) {
throw new Exception('no valid constructor for param count '.$argsCount);
}
return call_user_func_array($callback, $args);
}
}
class FooBar extends AlmostPolymorphicObject {
private function _construct0() {
}
private function _construct1($var1) {
}
private function _construct2($var1, $var2) {
}
}
$var = new FooBar(); // would run _construct0
$var = new FooBar('var'); // would run _construct1
$var = new FooBar('var','var'); // would run _construct2
$var = new FooBar('var','var', 'asdasd'); // would throw error 'no valid constructor for param count 3'