如何用另一个函数更改函数的默认值?

时间:2014-01-20 14:12:53

标签: php function default

function set_firstname($firstname){
// some code here
}
function fullname($lastname){
$firstname = set_firstname();
return $firstname." ".$lastname;
}
set_firstname("Rajesh");
echo fullname("Dhar");          // Rajesh Dhar
echo fullname("Basu");          // Rajesh Basu
echo fullname("Niyogi");        // Rajesh Niyogi
set_firstname("Sharmila");
echo fullname("Sen");           // Sharmila Sen
echo fullname("Chatterjee");    // Sharmila Chatterjee
echo fullname("Pal");           // Sharmila Pal

如何定义函数set_firstname以使上述代码正常工作?

4 个答案:

答案 0 :(得分:1)

function set_firstname($name = "") {
    static $_name;
    if($name != "") {
        $_name = $name;
    } else {
        return $_name;
    }
}

虽然我不得不承认,这是非常糟糕的编码风格。 (我的意见)

答案 1 :(得分:1)

您必须使用类,您可以在其中存储属于该类的变量。例如,

class Person
{
    protected $_Firstname;
    protected $_Lastname;

    public function __construct($firstname, $lastname)
    {
        // set the initial first- and lastname
        $this->_Firstname = $firstname;
        $this->_Lastname = $lastname;
    }

    public function __toString()
    {
        return sprinft("%s %s", $this->_Firstname, $this->_Lastname);
    }

    public function SetFirstname($value)
    {
        $this->_Firstname = $value;
    }
}

// create a new instance of a person
$p = new Person("Rajesh", "Dhar");

echo $p; // will display: "Rasjeh Dhar"

$p->SetFirstname("Sharmila");

echo $p; // will display: "Sharmila Dhar"

答案 2 :(得分:1)

更新
您似乎正在寻找一种方式来影响/更改函数的行为,方式date_default_timezone_set会影响date函数的行为。答案很简单:你不能......不是真的。你想到的功能实际上并没有改变其他功能。他们更改了运行时(ini设置等),而其他函数用来计算各自的返回值的是 runtime
想象date_default_timezone_set乘坐飞机:你可以飞到位于不同时区的世界的一部分,你的生物钟将适应(一段时间后)到另一个时区,你甚至会设置你的时钟不同。但是你的 house ,你的生日以及所有其他的东西都不会改变。您在任何给定时间的位置是“运行时”,并且它易于更改。这些变化可能会导致您的行为/反应不同,但实际上并不会改变您的身份......

使用常规函数,可以使用static个变量:

function firstname($name = null)
{
    static $return = 'Default';
    $return = $name ? $name : $return;
    return $return;
}
function fullName($name)
{
    return firstname().' '.$name;
}
//test:
echo fullName('foobar');//echoes Default foobar
firstname('Mr. ');
echo fullName('foobar');//echoes Mr. foobar

但是说实话, 不是开展业务的好方法。它难以维护,难以阅读且容易出错。说实话,如果您需要用户必须提供的2位数据,那么向用户询问这两个值时确实存在 nothing 错误:

function fullName($first, $last)
{
    return $first.' '.$last;
}

但是,为什么要使用功能呢? 更一般地说,您实际上正在寻找将与功能结合的方法。幸运的是:类就是这样(将数据与方法结合起来)。然后,“更好”或更合乎逻辑的方法是:

class Name
{
    protected $firstName = null;
    protected $lastName = null;
    public function __construct($first = 'Default', $last = null)
    {
        $this->firstName = $first;
        $this->lastName = $last;
    }
    public function getFullName($last = null, $first = null)
    {
        if ($last) $this->lastName = $last;
        if ($first) $this->firstName = $first;
        return $first.' '.$last;
    }
}

这里的类的额外好处,虽然我没有在我的示例中包含这个,但是你可以检查传递给方法的值,并且你可以过滤掉无效的输入。诸如is_string,正则表达式验证,filter_var调用之类的内容...... 除此之外,随着项目的增长,您可以非常轻松地详细说明给定的类,例如添加protected $email = null属性,以及执行filter_var($email, FILTER_VALIDATE_EMAIL)的setter以确保设置有效的电子邮件地址,你有一个很好的小数据容器,它可以容纳与一个人相关的各种数据,因为它在你的数据库中表示,并在你的其余代码中使用。

答案 3 :(得分:0)

$first_name = '';

function set_firstname($firstname){
    global $first_name;
    $first_name = $firstname;
}

function fullname($lastname){
    global $first_name;
    return $first_name ." ".$lastname;
}