PHP 7是否支持严格的资源类型?如果是这样,怎么样?
例如:
<?php
class appModel extends ActiveRecord\Model{
public $app,$attr;
public $db_config;
function __construct(array $attributes=array(), $guard_attributes=true, $instantiating_via_find=false, $new_record=true){
parent::__construct($attributes, $guard_attributes,$instantiating_via_find, $new_record);
}
function __call($key,$value){
parent::__call($key,$value);
}
public function load($data){
foreach($this->attributes as $attr=>$value){
if(!isset($this->attr["".$attr])){
//if(isset($data[$attr])) $this->attr["".$attr] = $data[$attr];
if(isset($data[$attr])) $this->attributes["".$attr] = $data[$attr];
}
}
}
}
以上将给出错误:
致命错误:未捕获的TypeError:传递给test()的参数1必须是资源的实例,给定资源
declare (strict_types=1);
$ch = curl_init ();
test ($ch);
function test (resource $ch)
{
}
上的var_dump显示它是资源(4,curl),手册说$ch
会返回资源。
是否可以严格键入curl_init ()
功能以支持test()
?
答案 0 :(得分:34)
PHP没有type hint for resources,因为
没有添加任何类型的资源提示,因为这会阻止资源从现有扩展的对象转移到某些已经完成的扩展(例如GMP)。
但是,您可以在函数/方法体中使用is_resource()
来验证传递的参数并根据需要进行处理。可重用的版本将是这样的断言:
function assert_resource($resource)
{
if (false === is_resource($resource)) {
throw new InvalidArgumentException(
sprintf(
'Argument must be a valid resource type. %s given.',
gettype($resource)
)
);
}
}
然后你可以在代码中使用:
function test($ch)
{
assert_resource($ch);
// do something with resource
}
答案 1 :(得分:7)
resource
不是valid type所以根据旧的PHP / 5类型提示,它被假定为类名。但curl_init()
不返回对象实例。
据我所知,没有办法指定资源。它可能不会那么有用,因为并非所有资源都相同:fopen()
生成的资源对oci_parse()
无用。