Класс PHP с тремя необязательными параметрами, но один обязательный? - PullRequest
9 голосов
/ 05 мая 2009

Так что, в принципе, я понимаю это ...

class User
{
    function __construct($id) {}
}

$u = new User(); // PHP would NOT allow this

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

class User
{
    function __construct($id=FALSE,$email=FALSE,$username=FALSE) {}
}

$u = new User(); // PHP would allow this

Есть ли способ сделать это?

Ответы [ 2 ]

24 голосов
/ 05 мая 2009

Вы можете использовать массив для адресации определенного параметра:

function __construct($param) {
    $id = null;
    $email = null;
    $username = null;
    if (is_int($param)) {
        // numerical ID was given
        $id = $param;
    } elseif (is_array($param)) {
        if (isset($param['id'])) {
            $id = $param['id'];
        }
        if (isset($param['email'])) {
            $email = $param['email'];
        }
        if (isset($param['username'])) {
            $username = $param['username'];
        }
    }
}

А как это можно использовать:

// ID
new User(12345);
// email
new User(array('email'=>'user@example.com'));
// username
new User(array('username'=>'John Doe'));
// multiple
new User(array('username'=>'John Doe', 'email'=>'user@example.com'));
1 голос
/ 05 мая 2009

Это остановит его выполнение и выведет ошибку на основе вашей конфигурации.

class User
{
    function __construct($id,$email,$username) 
    {
       if($id == null && $email == null && $username == null){
            error_log("Required parameter on line ".__LINE__." in file ".__FILE__);
            die();
       }
    }
}

$u = new User();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...