php 返回1是什么意思,如何在php 7.1中指示返回类型是当前的子类型?

本文探讨如何在PHP抽象类中使用类型提示,以便在子类调用`getSingle`方法时获得更精确的类型。作者提供了修改后的代码示例,解释了如何通过返回类型注解让子类B获得类型安全。同时讨论了ORM设计中的潜在安全问题和工厂模式的应用。
摘要由CSDN通过智能技术生成

我有

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值