目录
判断示例
在8.0之前,可以使用get_resource_type直接判断返回值。而从 PHP 8.0.0 开始替换 Socket 资源的完全不透明类,直接使用get_resource_type会报错:
PHP Fatal error: Uncaught TypeError: get_resource_type(): Argument #1 ($resource) must be of type resource,
代码
$sock = socket_create(AF_INET, SOCK_RAW, getprotobyname('icmp'));
var_dump(gettype($sock));
if(is_resource($sock)){
var_dump(get_resource_type($sock));
}else{
var_dump('is_resource return false');
}
$stream = socket_export_stream($sock);
var_dump(gettype($stream));
if(is_resource($stream)){
var_dump(get_resource_type($stream));
}else{
var_dump('is_resource return false');
}
返回值
php 8.0 之前
string(8) "resource"
string(6) "Socket"
string(8) "resource"
string(6) "stream"
php 8.0 之后
string(6) "object"
string(24) "is_resource return false"
string(8) "resource"
string(6) "stream"
优化后代码
function get_resource_type_ex($sock){
if(\version_compare(\PHP_VERSION,'8.0.0', 'ge') ){
if(gettype($sock) == 'object'){
if(get_class($sock)=== 'Socket'){
return 'Socket';
}else{
return false;
}
}else if(gettype($sock) === 'resource'){
if(get_resource_type($sock) == 'stream'){
return 'stream';
}else{
return false;
}
}
}else{
if(is_resource($sock)){
if(get_resource_type($sock) === 'stream'){
return 'stream';
}elseif(get_resource_type($sock) === 'Socket'){
return 'Socket';
}else{
return false;
}
}else{
return false;
}
}
}