为什么有些变量是参数而其他变量不是?

时间:2010-07-27 17:14:51

标签: php

这可能是什么原因:

public function __construct($host, $port, $timeout = 5){
    $errnum = 0;
    $errstr = ''; 

而不是:

public function __construct($host, $port, $errnum = 0, $errstr = '', $timeout = 5){

为什么有些人是params而有些人不是?

非常感谢, MEM

6 个答案:

答案 0 :(得分:5)

函数定义定义函数本身与调用它的代码之间的契约。

如果调用者应该指定它的值,则变量应该只是一个参数。否则,如果变量仅由函数内部使用,则无需将其指定为参数。

答案 1 :(得分:2)

错误由函数设置,并且

中没有任何一点传递

答案 2 :(得分:1)

如果它们是params,则用户可以在创建对象期间传递它们。像

这样的电话

$ a =新的MyObject($ myhost,$ myport,40000,'失败。',$ mytimeout);

将初始化您的对象,其内存中已存在错误...如果出现错误编号或字符串,则这是不需要的。用户不应该将随机错误戳到您的对象中。

答案 3 :(得分:1)

通常情况下,您定义一个函数的方式是它只接受需要才能运行的参数/数据。

在您的示例中,$errnum$errstr似乎是函数在内部使用的变量。如果你设计了这个功能,你必须决定是否要给用户提供覆盖它们的可能性。

答案 4 :(得分:0)

也许你想用超过3个参数调用构造函数,具体取决于构造函数/类的作用。参数列表不是初始化局部变量的地方。检查您正在阅读的类的API(参见适用于fsockopen函数的内容),请首先阅读本文档。

答案 5 :(得分:0)

$ timeout是一个默认参数,可以在调用函数时覆盖。

$ errnum和$ errstr在调用函数时不能被覆盖。

观察:

public function goodConstruct($host, $port, $timeout = 5){
    $errnum = 0;
    $errstr = ''; 
}

goodConstruct('hostname',8443,60);

通过这样做,我可以覆盖默认超时。

public function badConstruct($host, $port, $errnum = 0, $errstr = '', $timeout = 5)
{

//code
}

badConstruct('hostname',8443,99,'hey look at this silly error!!!!',900);

现在我也可以覆盖错误代码(假设这是errnum的目的,如果那是某种计数器则更糟)和错误字符串。你真的希望能够通过函数调用控制它吗?可能不是......我认为你希望修复它。