spl_autoload_register报错Segmentation fault: 11

SPL自动加载报错

已经不是一次遇到这个问题了,以前在自己编写 SPL 自动引用函数的时候也报过错,当时的解决方法是使用 compser,可是这次又碰到了这个问题,就很好奇,到底是什么导致了Segmentation fault: 11错误。

代码逻辑很简单,在同一目录下直接使用 include 函数进行自动加载。

spl_autoload_register('my_autoload');
function my_autoload($name){
    include  $name.'.php';
}

目录结构

clipboard.png

代码示例

<?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);
}
阅读 2.3k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题