如何解决在 php 8.x
我正在制作一个框架来制作我自己的服务器,为此我实现了许多类,其中一个是名为模型的类,它是支持其他特定模型的通用父类。 这是类模型的构造:
namespace app\core;
use app\models\RegisterModel;
abstract class Model
{
/*just definition of generic properties and rules to the model*/
public array $errors = [];
public const RULE_REQUIRED = 'required';
public const RULE_EMAIL = 'email';
public const RULE_MIN = 'min';
public const RULE_MAX = 'max';
public const RULE_MATCH = 'match';
/*the purpouse of this function is load data to the object,when i save the data this way it works well*/
public function loadData($data){
foreach($data as $key => $value){
if (property_exists($this,$key)){
$this->{$key} = $value;
}
};
}
/这是给我带来麻烦的函数/
公共函数validate(){
foreach ($this->rules() as $attibute => $rules) {
// code...
$value = $this->{$attibute};
foreach ($rules as $rule) {
// code...
$ruleName = $rule;
if (!is_string($ruleName)) {
// code...
$ruleName = $rule[0];
}
if ($ruleName == self::RULE_REQUIRED && !$value){
$this->addError($attribute,self::RULE_REQUIRED);
}
}
}
}
这是子类
namespace app\models;
use app\core\Model;
class RegisterModel extends Model
{
public string $firstname;
public string $lastname;
public string $email;
public string $password;
public string $confirmPassword;
/*los nombres tienen que coincidir con los deldocumento register.php*/
public function register(){
return true;
}
public function rules(): array{
return [
'firstname'=> [self::RULE_REQUIRED],'lastname'=> [self::RULE_REQUIRED],'email'=> [self::RULE_REQUIRED,self::RULE_EMAIL],'password'=> [self::RULE_REQUIRED,[self::RULE_MIN,'min'=>8],[self::RULE_MAX,'max'=>24]],[self::RULE_MATCH,'match'=>'password']]
];
}
}
当我创建类的实例(我们称之为 ChildInstance)并加载 $firstname、$lastname、$email、$password、$confirmpasword 的信息,然后在 ChildInstance 上使用 var_dump 时,我可以看到我加载的信息这个实例。但是当我使用函数validate(函数validate和loadData都属于父类)时,它会引发这个错误:
Uncaught Error: Typed property app\models\RegisterModel::$firstname must not be accessed before initialization
我已经用继承解决了这个问题,但是用这个方法解决不了,为什么不能用父类的函数访问存储的信息?谢谢
解决方法
发生这种情况是因为类型化的属性,即 public string $firstname
。
当您定义一个属性的类型,但不给它一个默认值时,它在 PHP 引擎盖下具有 uninitialized
状态。这个错误本质上是在说:你在给它一个值之前就试图访问它。
借用madewithlove的例子,这会导致同样的错误:
class User
{
private int $id;
private string $username;
public function __construct(int $id)
{
$this->id = $id;
}
public function getUsername(): string
{
return $this->username;
}
}
$user = new User(1);
echo $user->getUsername();
请注意,我们从未给 $username
赋值,也没有在属性上设置默认值。
我不确定最好的解决方案是什么;这取决于您共享的 Model
旨在做什么,如何实例化子实例等。设置默认属性值是一种选择。通过反射实例化模型和属性值可能是另一回事。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。