函数返回各种数据类型

时间:2011-01-29 16:30:25

标签: php function

在CakePHP中有一个名为find的(非常基础的)方法。大多数情况下,此方法将返回一个数组,但如果您将count作为第一个参数传递,则该方法将返回不同的数据类型 - 整数。

允许该方法返回各种数据类型。

不是那么糟糕吗?

4 个答案:

答案 0 :(得分:1)

没有。这是一种灵活的方式。在PHP标准函数中也返回不同的类型。例如strpos()。它可以返回integer位置和boolean false。

答案 1 :(得分:1)

这是设计的。 PHP是动态类型语言,因此您无法防范返回各种数据类型的函数(与Java不同,您可以确定函数返回的内容)。 这是非常灵活的(但也可能是坏的)所以通过编写单元测试来防止意外结果是一个好主意。 You can see phpunit for a Unit Testing framework.

答案 2 :(得分:1)

脚本语言倾向于使用这种返回多种类型的模式,具体取决于输入参数的类型或参数的值。

这可能令人困惑,但只要你有良好的文档,它就不是问题而且非常强大。

强类型语言使用函数重载来做同样的事情。

答案 3 :(得分:1)

只要记录行为,就不是坏事。在C / C ++中,每个例子都是一种强类型语言,你可以通过使用void指针(void*)来实现类似的结果:

// returns a "const char*" if c == 0
// returns a "string*" if c == 1
const void* foo(int c) {
    const void* a;
    if (c == 0) {
        a = (const void*)"foo";
    } else if (c == 1) {
        string* b = new string("bar");
        a = (const void*)b;
    }
    return a;
}

然后你可以这样做:

const char* x = (const char*)foo(0); // get a const char*
string* y = (string*)foo(1);         // get a string*
std::cout << x << *y;                // prints "foobar"

但是,未正确记录可能会导致意外行为。因为如果要将指针强制转换为意外类型,然后使用:

string* y = (string*)foo(0);         // get a const char*, bad type cast
std::cout << *y;                     // Segmentation fault

以上编译很好但在运行时失败。当然,在PHP中执行类似的操作不会出现段错误,但很可能会破坏程序的其余部分。