SPL自动加载报错
已经不是一次遇到这个问题了,以前在自己编写 SPL 自动引用函数的时候也报过错,当时的解决方法是使用 compser,可是这次又碰到了这个问题,就很好奇,到底是什么导致了Segmentation fault: 11错误。
代码逻辑很简单,在同一目录下直接使用 include 函数进行自动加载。
spl_autoload_register('my_autoload');
function my_autoload($name){
include $name.'.php';
}
目录结构
代码示例
<?php
class StorageAdapter
{
private $data = [];
public function __construct(array $data){
$this->data = $data;
}
public function find(int $id)
{
if (isset($this->data[$id])) {
return $this->data[$id];
}
return null;
}
}
<?php
class User
{
private $username;
private $email;
public static function fromState(array $state)
{
return new self($state['username'],$state['email']);
}
public function __construct(string $username, string $email)
{
$this->username = $username;
$this->email = $email;
}
public function getUsername()
{
return $this->username;
}
public function getEmail()
{
return $this->email;
}
}
<?php
class UserMapper
{
private $adapter;
public function __construct(StorageAdapter $storage)
{
$this->adapter = $storage;
}
public function findById(int $id): User
{
$result = $this->adapter->find($id);
if ($result === null) {
throw new \InvalidArgumentException("User #$id not found");
}
return $this->mapRowToUser($result);
}
private function mapRowToUser(array $row) : User
{
return User::fromState($row);
}
}
<?php
spl_autoload_register('my_autoload');
function my_autoload($name){
include $name.'.php';
}
$storage = new StorageAdapter([1=>['username'=>'domnikl','email'=>'liebler@qq.com']]);
//
$maaper = new UserMapper($storage);
//
$user = $maaper->findById(1);
var_dump($user);
引起错误的代码行
经过一步步的排查,当程序走到mapRowToUser方法的时候就会报错
private function mapRowToUser(array $row) : User
{
return User::fromState($row);
}