如何在php 7.1中指示返回类型是当前的子类型?
作者:互联网
我有
abstract class A{
public static function getSingle($where = []) {
$classname = get_called_class();
$record = static::turnTheWhereIntoArecordFromDB($where);
$model = new $classname($record);
return $model;
}
}
class B extends A{
}
$x = B::getSingle();
$x没有类型提示…我喜欢类型提示,所以我想要B而不是A的类型提示
如何直接为$x启用类型提示?
我以为是这样的
public function getSingle($where = []) : ?get_called_class()
这显然不起作用
有什么用吗?
根据评论要求进行编辑:我在上面的原始问题中添加了我认为丢失的点点滴滴.
有关更完整的源代码,请参见下文.随意发表评论,但这实际上不是问题的一部分.我对以下代码的怀疑与如何使用该接口有关.例如. $where是[‘my_column_name’=> ‘my_column_val’]导致my_column_name =’my_column_val’并最终导致安全隐患.但是,这确实是一个糟糕的程序员ORM.
protected abstract static function get_tablename();
/**
* @param array $where
* @return static|null
*/
public static function getSingle($where = []) {
/** @var wpdb $wpdb */
global $wpdb;
$qr = static::whereToString($where);
$sql = "SELECT * FROM " .$wpdb->prefix . static::get_tablename() . " WHERE ". $qr ;
$record = $wpdb->get_row($sql);
if(!$record){
return null;
}
$classname = get_called_class();
$model = new $classname($record);
return $model;
}
/**
* @param array $where
* @return string
*/
private static function whereToString(array $where): string
{
$i = 0;
$max = sizeof($where);
$qr = '';
foreach ($where as $name => $val) {
if (is_string($val)) {
$qr .= " {$name} = '" . $val . "' ";
} else {
$qr .= " {$name} = " . $val . " ";
}
$i++;
if ($i < $max) {
$qr .= ' AND ';
}
}
return $qr;
}
解决方法:
对于您提供的示例,为什么需要使用工厂方法?您正在通过构造函数创建新实例,为什么不只是$x = new B($record)!
上面更新
abstract class A
{
/**
* @param array $where
* @return static
*/
public static function getSingle($where = [])
{
$classname = get_called_class();
$model = new $classname($record);
return $model;
}
}
@return static将类型提示其子类.我也将您的功能更改为静态功能,这是典型的工厂模式.
标签:type-hinting,php-7,php-7-1,php 来源: https://codeday.me/bug/20191025/1930430.html