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

Php 如何用另一个函数更改函数的默认值?,php,function,default,Php,Function,Default,我应该如何定义函数set_firstname,以使上述代码正常工作 function set_firstname($firstname){ // some code here } function fullname($lastname){ $firstname = set_firstname(); return $firstname." ".$lastname; } set_firstname("Rajesh"); echo fullname("Dhar"); // Rajes

我应该如何定义函数
set_firstname
,以使上述代码正常工作

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

尽管我不得不承认,这确实是一种糟糕的编码风格。(我的意见)

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

function set_firstname($name = "") {
    static $_name;
    if($name != "") {
        $_name = $name;
    } else {
        return $_name;
    }
}
更新:
似乎您正在寻找一种方法来影响/更改函数的行为,就像
date\u default\u timezone\u set
全面影响
date
函数的行为一样。答案很简单:你不能。。。不是真的。您正在考虑的函数实际上不会改变其他函数。它们更改运行时(ini设置等),其他函数使用该运行时来计算各自的返回值。
date\u default\u timezone\u set
想象成上飞机:你可以飞到世界上位于不同时区的一部分,你的生物钟(过一段时间)会适应另一个时区,你甚至会以不同的方式设置你的时钟。但是你的房子,你的生日和其他一切都不会改变。您在任何给定时间所处的位置都是您的“运行时”,它容易受到更改的影响。这些改变可能会导致你的行为/反应不同,但实际上并不会改变你是谁

使用常规函数,您可以使用
静态
变量:

$first_name = '';

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

function fullname($lastname){
    global $first_name;
    return $first_name ." ".$lastname;
}
但说实话,这不是一个好的方式去做你的生意。它很难维护,很难阅读,而且容易出错。老实说,如果您需要用户必须提供的2位数据,那么要求用户提供这两个值并没有什么错:

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
但是,为什么要使用函数呢?
更一般地说,您实际上在寻找一种将状态与功能结合起来的方法。幸运的是:类就是这样做的(将数据与方法耦合)。那么,“更好”或更符合逻辑的方法是:

function fullName($first, $last)
{
    return $first.' '.$last;
}
这里类的另一个好处是,尽管我的示例中没有包括这一点,但是您可以检查传递给方法的值,并且可以过滤掉无效的输入。像
是字符串
、正则表达式验证、
过滤器变量
调用等…

此外,随着项目的发展,您可以非常轻松地详细说明给定的类,比如添加
protected$email=null
属性,以及执行
filter\u var($email,filter\u VALIDATE\u email)
的setter,以确保设置了有效的电子邮件地址,并为自己提供了一个漂亮的小数据容器,它可以保存与某人相关的各种数据,如数据库中所示,并在代码的其余部分中使用。

有人能告诉我否决票是为了什么吗?尽管我没有否决票:所以问题必须表明你的努力(是研究还是编码尝试)这表明你实际上已经试着得到你所需要的。您只需显示两个函数,一个是空的-除了一个
//code here
注释-基本上,询问“我可以在这里放置什么代码来执行此操作”。。。这并没有显示出你所付出的努力。你忘记了在这两个功能中使用“全局”了。是的。固定的。谢谢你的通知。哎哟。。。在我的回答中,我已经说过,
static
是一个多么糟糕的主意。。。使用
global
更糟糕:如果变量已经是全局变量,为什么还要麻烦使用
fullname
函数,而不是简单地使用
$fullname=$first\u name.''.$lastname不调用函数?为什么称之为“非常糟糕的编码风格”?我认为像
date\u default\u timezone\u set
imagesetthickness
这样的函数是以类似的方式构造的。我自己更喜欢类,因为这样我们就可以清楚地知道它可能包含变量。一个函数不应该存储任何东西,但这只是我的观点。我的问题是“如何用另一个函数更改函数的默认值?”我本可以引用
date\u default\u timezone\u set
imagesetthickness
作为示例,但我冒险了(愚蠢的,现在我明白了)创建我自己的示例,以便这里没有人因为没有代码而标记我的问题。我保证我不会在我生命中的任何地方使用像
set_firstname
fullname
这样的函数。@SoumalyoBardhan:答案很简单:你不能
date\u default\u timezone\u set
不会更改任何
date
函数的返回值。它更改运行时的设置,其他函数从中获取生成输出所需的数据。从属函数返回计算结果,此计算的输入从系统设置+ini设置的组合中提取。您可以更改那些
ini
,函数本身保持不变。您可以获得的最接近的是
ReflectionClass
instances@SoumalyoBardhan:编辑了我的答案,解释了用户定义函数和使用运行时返回给定值的函数之间的区别
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;
    }
}