PHP function as parameter default

2019-02-22 12:20发布

Take the following function for example:

private function connect($method, $target = $this->_config->db()) {
    try {
        if (!($this->_pointer = @fopen($target, $method)))
            throw new Exception("Unable to connect to database");
    }  catch (Exception $e) {
            echo $e->getMessage();
    }
}

As you can see I inserted the function $this->_config->db() into the parameter $target as it's default value. I understand this is not the correct syntax and am just trying to explain my aim.

$this->_config->db() is a getter function.

Now I know I can use an anonymous function and call it via $target later, but I want $target to also accept direct string values.

How could I give it a default value of the whatever is returned by $this->_config->db() and still be able to overwrite it with a string value?

标签: php oop function
3条回答
我欲成王,谁敢阻挡
2楼-- · 2019-02-22 12:36

You can use is_callable() and is_string().

private function connect($method, $target = NULL) {
    if (is_callable($target)) {
        // We were passed a function
        $stringToUse = $target();
    } else if (is_string($target)) {
        // We were passed a string
        $stringToUse = $target;
    } else if ($target === NULL) {
        // We were passed nothing
        $stringToUse = $this->_config->db();
    } else {
        // We were passed something that cannot be used
        echo "Invalid database target argument";
        return;
    }
    try {
        if (!($this->_pointer = @fopen($stringToUse, $method)))
            throw new Exception("Unable to connect to database");
    }  catch (Exception $e) {
            echo $e->getMessage();
    }
}
查看更多
叛逆
3楼-- · 2019-02-22 12:43

Why not accept NULL values by default (test with is_null()) and if so call your default function?

查看更多
老娘就宠你
4楼-- · 2019-02-22 12:47

I would perform a check to see if a value was passed and call my function in a simple check inside the method:

private function connect($method, $target = '') {
    try {
        if ($target === '') {
            $target = $this->_config->db()
        }

        if (!($this->_pointer = @fopen($target, $method))) {
            throw new Exception("Unable to connect to database");
        }
    } catch (Exception $e) {
        echo $e->getMessage();
    }
}
查看更多
登录 后发表回答