可捕获的致命错误:类__PHP_Incomplete_Class的对象无法转换为字符串

zwghvu4y  于 2023-03-16  发布在  PHP
关注(0)|答案(3)|浏览(152)

当我想要打开一个简单页面时出现错误。以下是完整错误:
上下文错误异常:可捕获的致命错误:无法将类__PHP_不完整_类的对象转换为字符串,位于/apache 2/htdocs/engelsvandenbroecke/vendor/symfony/symfony/src/symfony/component/security/Core/authentication/Token/AbstractToken. php第70行
我在symfony项目中所做的是:

  • 从数据库生成实体
  • 编辑用户实体以确保安全
  • 编辑安全.yml
  • 添加了两个数据固定装置

这是我的用户实体类:

<?php

namespace Beachteam\BeachteamBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;

/**
 * User
 *
 * @ORM\Table(name="user", uniqueConstraints={@ORM\UniqueConstraint(name="username_UNIQUE", columns={"username"})}, indexes={@ORM\Index(name="fk_users_roles_idx", columns={"role_id"})})
 * @ORM\Entity
 */
class User implements AdvancedUserInterface
{
    /**
     * @var string
     *
     * @ORM\Column(name="username", type="string", length=45, nullable=false)
     */
    private $username;

    /**
     * @var string
     *
     * @ORM\Column(name="password", type="string", length=60, nullable=false)
     */
    private $password;

    /**
     * @var string
     *
     * @ORM\Column(name="salt", type="string", length=30, nullable=false)
     */
    private $salt;

    /**
     * @var string
     *
     * @ORM\Column(name="firstname", type="string", length=45, nullable=false)
     */
    private $firstname;

    /**
     * @var string
     *
     * @ORM\Column(name="surname", type="string", length=45, nullable=false)
     */
    private $surname;

    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255, nullable=false)
     */
    private $email;

    /**
     * @var string
     *
     * @ORM\Column(name="token", type="string", length=45, nullable=true)
     */
    private $token;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="created", type="datetime", nullable=false)
     */
    private $created;

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var \Beachteam\BeachteamBundle\Entity\Role
     *
     * @ORM\ManyToOne(targetEntity="Beachteam\BeachteamBundle\Entity\Role")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="role_id", referencedColumnName="id")
     * })
     */
    private $role;

    private $plainPassword;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36);
    }

    /**
     * Set username
     *
     * @param string $username
     * @return User
     */
    public function setUsername($username)
    {
        $this->username = $username;

        return $this;
    }

    /**
     * Get username
     *
     * @return string 
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * Set password
     *
     * @param string $password
     * @return User
     */
    public function setPassword($password)
    {
        $this->password = $password;

        return $this;
    }

    /**
     * Get password
     *
     * @return string 
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * Set salt
     *
     * @param string $salt
     * @return User
     */
    public function setSalt($salt)
    {
        $this->salt = $salt;

        return $this;
    }

    /**
     * Get salt
     *
     * @return string 
     */
    public function getSalt()
    {
        return $this->salt;
    }

    /**
     * Set firstname
     *
     * @param string $firstname
     * @return User
     */
    public function setFirstname($firstname)
    {
        $this->firstname = $firstname;

        return $this;
    }

    /**
     * Get firstname
     *
     * @return string 
     */
    public function getFirstname()
    {
        return $this->firstname;
    }

    /**
     * Set surname
     *
     * @param string $surname
     * @return User
     */
    public function setSurname($surname)
    {
        $this->surname = $surname;

        return $this;
    }

    /**
     * Get surname
     *
     * @return string 
     */
    public function getSurname()
    {
        return $this->surname;
    }

    /**
     * Set email
     *
     * @param string $email
     * @return User
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }

    /**
     * Get email
     *
     * @return string 
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * Set token
     *
     * @param string $token
     * @return User
     */
    public function setToken($token)
    {
        $this->token = $token;

        return $this;
    }

    /**
     * Get token
     *
     * @return string 
     */
    public function getToken()
    {
        return $this->token;
    }

    /**
     * Set created
     *
     * @param \DateTime $created
     * @return User
     */
    public function setCreated($created)
    {
        $this->created = $created;

        return $this;
    }

    /**
     * Get created
     *
     * @return \DateTime 
     */
    public function getCreated()
    {
        return $this->created;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set role
     *
     * @param \Beachteam\BeachteamBundle\Entity\Role $role
     * @return User
     */
    public function setRoles(\Beachteam\BeachteamBundle\Entity\Role $role = null)
    {
        $this->role = $role;

        return $this;
    }

    /**
     * Get role
     *
     * @return \Beachteam\BeachteamBundle\Entity\Role 
     */
    public function getRoles()
    {
        return array($this->role->getName());
    }

    public function eraseCredentials()
    {
        $this->setPlainPassword(null);
    }

    public function getPlainPassword()
    {
        return $this->plainPassword;
    }

    public function setPlainPassword($plainPassword)
    {
        $this->plainPassword = $plainPassword;
    }

    /**
     * Implementation of AdvancedUserInterface method
     *
     * @return boolean
     */
    public function isAccountNonExpired()
    {
        return true;
    }

    /**
     * Implementation of AdvancedUserInterface method
     *
     * @return boolean
     */
    public function isAccountNonLocked()
    {
        return true;
    }

    /**
     * Implementation of AdvancedUserInterface method
     *
     * @return boolean
     */
    public function isCredentialsNonExpired()
    {
        return true;
    }

    /**
     * Implementation of AdvancedUserInterface method
     *
     * @return boolean
     */
    public function isEnabled()
    {
        return true;
    }
}

我的安全。yml:

security:
encoders:
    Beachteam\BeachteamBundle\Entity\User:
        algorithm: bcrypt
        cost: 15

role_hierarchy:
    ROLE_SUPER_ADMIN: ROLE_ADMIN

providers:
    users:
        entity:
            class: BeachteamBundle:User
            property: username

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false

    secured_area:
        pattern: ^/
        anonymous: ~
        form_login:
            login_path: beach_team_loginpage
            check_path: beach_team_logincheck
            username_parameter: login[username]
            password_parameter: login[password]
            always_use_default_target_path: true
            default_target_path: beach_team_adminpage
        logout:
            path:   beach_team_logout
            target: beach_team_loginpage
        remember_me:
             key:      "%secret%"
             lifetime: 31536000 # 365 days in seconds
             path:     /
             domain:   ~ # Defaults to the current domain from $_SERVER
             remember_me_parameter: remember

access_control:
    #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
vmpqdwk3

vmpqdwk31#

对我来说,帮助会清除缓存/cookie在浏览器中。(在浏览器会话中存储了旧版本的用户的实体)。

fdbelqdn

fdbelqdn2#

此错误通常意味着您试图反序列化对象,而没有为该对象加载类。因此,您应该以某种方式定义此类(例如,包括文件),然后反序列化它。

efzxgjgh

efzxgjgh3#

Maxim Khan-Magomedov所写的答案是正确的潜在原因,对我来说,清除该高速缓存和cookie没有帮助。我正在使用的系统是CentOS 6.10上的PHP 7.1.33。
错误的第一部分和最后一部分'PHP Recoverable fatal error: Object of class... ...could not be converted to string in...'是由于试图将对象强制转换为字符串,而不是调用getter方法(就像对象值被设计为访问的那样)。

示例:

<?php
  class foo
  {
    function getValue()
    {
      return 'a foo';
    }
  }
  $bar = new foo;
  echo $bar->getValue(); // correct way to access an object's value
  
  //incorrect, throws error shown:
  echo 'String $bar?: '.(string)($bar);
  // Recoverable fatal error:  Object of class foo could not be converted to string
  // in /home/.../....php on line (X).

正如Maxim Khan-Magomedov所说,在错误'...class __PHP_Incomplete_Class ...'的中间部分添加,是将对象放入会话变量中,然后在没有首先序列化它的情况下切换页面,然后尝试将它转换为字符串。

示例:
第1页:

<?php
  session_start();
  class foo
  {
    function getValue()
    {
      return 'a foo';
    }
  }
  $bar = new foo;
  $_SESSION['A_Foo']=$bar;

第2页:

<?php
  session_start();
  echo "String $_SESSION['A_Foo']?: ".(string)($_SESSION['A_Foo']);
  // Recoverable fatal error:  Object of class __PHP_Incomplete_Class could not be
  // converted to string in /home/.../.../....php on line (X)

我通过在我正在处理的某个东西中看到它,找到这个页面,清除缓存,发现它不工作,检查我的工作并注意到丢失的->getValue(),修复它并看到错误消失,然后研究中间部分并一起测试,以确保我可以复制错误。
这几页帮助我弄清楚了中间的部分:PHP Session with an Incomplete Object
什么是PHP中的不完整类?https://www.quora.com/What-is-an-incomplete-class-in-PHP
PHP PHP包含我的SESSION数据的不完整类对象:https://www.edureka.co/community/94958/php-php-incomplete-class-object-with-my-session-data
__PHP_Incomplete_Class Object even though class is included before session started
Other reasons for __PHP_Incomplete_Class
PHP中的__PHP_不完整类对象:https://lifemichael.com/en/the-__php_incomplete_class-object-in-php-pro/
PHP中的__PHP_不完整_类对象视频:https://www.youtube.com/watch?v=rs7qUJEY3Ag

相关问题