1

有一段时间我一直在使用:gettype();动态获取变量强制转换类型,例如:

function Type ($Value = null){
 return gettype($Value);
}


echo Type(array()); // Echo array
echo Type (1); // Echo integer
echo Type(1.2); // echo doubble

然而,我正在寻找一种具有通用且已知整数表示的方法,我相信这比传统字符串更容易验证。

有没有人对此有可能的解决方案?

我有这样的事情:

function Type ($Value = null){
 $Type = gettype($Value);
 if ($Type === "array"){
   return 1;
 }elseif ($Type === "integer"){
   return 2;
 }
 // ...

}

这种方法可以完成工作,但看起来很乱,而且当涉及到我的代码时,我是一个干净的怪物......有没有看起来更优雅的东西?

4

3 回答 3

3

这个怎么样:

function typeAsNumber( $var = null ) {

   $validTypes = array( "boolean", 
                        "integer", 
                        "double", 
                        "string", 
                        "array",  
                        "object", 
                        "resource", 
                        "NULL", 
                        "unknown type" 
                      );

   return array_search( gettype( $var ), $validTypes);

}
于 2013-08-10T23:27:40.557 回答
2

正如你所说,我不知道你为什么要这样做。你一直在使用这个函数,所以你显然已经围绕返回的结果创建了代码。所以修改如此重要的函数可能/可能会导致并发症滚动更新时,因为这将包括大量代码结构更改,以及创建简单 API 的方法是保持连续性。因此,如果此代码可供公众使用,那么剧烈的更改将使人们感到尴尬(如果使用) 升级到另一个版本。

如果你也有..这是我刚刚写的:

function Cast_Type ($Value = null){
    $Type = gettype($Value);
    switch ($Type){
        case "boolean":
            return 1;
            break;
        case "integer":
            return 2;
            break;
        case "double":
            return 3;
            break;
        case "string":
            return 4;
            break;
        case "array":
            return 5;
            break;
        case "object":
            return 6;
            break;
        case "resource":
            return 7;
            break;
        case "NULL":
            return 8;
            break;
        case "unknown type":
            return false;
            break;
    }
}

使用switchandcase方法可以让用户轻松阅读您的代码,并且可以更轻松地验证返回,例如resource......7

于 2013-08-10T23:28:37.620 回答
2

当一个函数返回一组枚举值中的一个时,将它们定义为常量是很常见的。这允许人们在不知道值是什么的情况下在代码的其他地方引用它们。

例如:

define('TYPE_BOOLEAN', 0);
define('TYPE_INTEGER', 1);
define('TYPE_FLOAT', 2);
define('TYPE_STRING', 3);
define('TYPE_ARRAY', 4);
define('TYPE_OBJECT', 5);
define('TYPE_RESOURCE', 6);
define('TYPE_NULL', 7);
define('TYPE_UNKNOWN', 8);

function type($var) {
    switch (gettype($var)) {
        case 'boolean':
            return TYPE_BOOLEAN;
        case 'integer':
            return TYPE_INTEGER;
        case 'double':
            return TYPE_FLOAT;
        case 'string':
            return TYPE_STRING;
        case 'array':
            return TYPE_ARRAY;
        case 'object':
            return TYPE_OBJECT;
        case 'resource':
            return TYPE_RESOURCE;
        case 'NULL':
            return TYPE_NULL;
    }
    return TYPE_UNKNOWN;
}

现在,当您使用该函数时,您可以编写有意义的代码。它不type()只是返回一个无法描述的整数,而是返回一个可以与常量进行比较的整数。

if (type($val) === TYPE_OBJECT) {
    $val = (array) $val;
}

这一切都说了,但是,这样做有点不必要。该gettype()函数总是为相同的类型返回相同的值,因此将返回值与类似的东西进行比较'object'也可以完成这项工作。

if (gettype($val) === 'object') {
    $val = (array) $val;
}
于 2013-08-10T23:38:15.363 回答