这可能是什么原因:
public function __construct($host, $port, $timeout = 5){
$errnum = 0;
$errstr = '';
而不是:
public function __construct($host, $port, $errnum = 0, $errstr = '', $timeout = 5){
为什么有些人是params而有些人不是?
非常感谢, MEM
答案 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的目的,如果那是某种计数器则更糟)和错误字符串。你真的希望能够通过函数调用控制它吗?可能不是......我认为你希望修复它。