PHP : "Fatal error: Using $this when not in object context in"

PHP : "Fatal error: Using $this when not in object context in"

我想为许可证管理器创建一个 class,但是,我必须使用另一个 class 来做我需要做的是在 __construct class .

当我尝试使用函数时,在本例中为 getAll,屏幕上出现 PHP 错误:

致命错误:在 [...] 行 112 的对象上下文中使用 $ this WHEN NOT。

这是我的 class :

class cLicences {

    // Contient les valeurs à afficher
    protected $iLicID                = null;
    protected $sLicProduct           = null;
    protected $sLicDesc              = null;
    protected $sLicKey               = null;
    protected $iLicDateAdded         = null;
    protected $iLicDateEdited        = null;
    protected $iLicUserAdded         = null;
    protected $iLicUserEdited        = null;

    // Connexion à la base de données
    private $oLicMySQL               = null;

    // Contient les noms des champs dans la db
    private static $sFieldID         = 'id_licence';
    private static $sFieldProduct    = 'lic_product';
    private static $sFieldDesc       = 'lic_desc';
    private static $sFieldKey        = 'lic_key';
    private static $sFieldDateAdded  = 'lic_date_added';
    private static $sFieldDateEdited = 'lic_date_edited';
    private static $sFieldUserAdded  = 'idx_user_added';
    private static $sFieldUserEdited = 'idx_user_edited';

    // Nom de la table
    const TABLENAME = 't_licences';

    /**
     * Initialisation de l'objet
     * @param int $iLicID -> ID de la licence
     */
    public function __construct($iLicID = null) {

        // Si l'ID est un ID (numérique donc)
        if(is_numeric($iLicID)) {

            // Stock la connexion dans la classe
            $this->oLicMySQL = new cMySQLi(DB_USERNAME,DB_PASSWORD,DB_HOSTNAME,DB_HOSTPORT,DB_DATABASE);

            // Initialise l'ID de la classe avec l'ID passé en param
            $this->iLicID = $iLicID;

            // Initialise les variables de la classe selon l'ID
            $this->init();
        }

    }

    /**
     * Détruit la connexion à la db
     */
    public function __destruct() {
        $this->oLicMySQL->fClose();

    }

    /**
     * Retourne la valeur souhaitée selon le nom du champ en param
     * @param string $sName -> Nom du champs
     * @return string
     */
    public function __get($sName) {

        // Retourne la valeur souhaitée
        return $this->$sName;

    }

    /**
     * Initalise les variables de la classe avec les données reçuent selon l'ID
     */
    public function init() {

        // Séléctionne la licence selon ID
        $sReqSltLic = 'SELECT *
                        FROM '.self::TABLENAME.'
                        WHERE '.self::$sFieldID.' = "'.$this->iLicID.'"
                        LIMIT 1';

        // Exécute la requête
        $rLic = $this->oLicMySQL->fQuery($sReqSltLic);

        // Met en forme la ressource SQL
        $aLic = $this->oLicMySQL->fFetch($rLic);

        // Assigne aux variables de la class les données reçuent
        $this->sLicProduct       = $aLic[self::$sFieldProduct];
        $this->sLicDesc          = $aLic[self::$sFieldDesc];
        $this->sLicKey           = $aLic[self::$sFieldKey];
        $this->iLicDateAdded     = $aLic[self::$sFieldDateAdded];
        $this->iLicDateEdited    = $aLic[self::$sFieldDateEdited];
        $this->iLicUserAdded     = $aLic[self::$sFieldUserAdded];
        $this->iLicUserEdited    = $aLic[self::$sFieldUserEdited];

    }

    /**
     * Récupère toutes les licences
     * @param ressource SQL $rData -> & indique l'index mémoire de la variable
     * @param string $sArg -> Argument pour la séléction des licences
     * @return \cLicences
     */
    public function getAll(&$rData,$sArg = null) {
        if(empty($rData)) {
            $sReqSltAll = 'SELECT *
                            FROM '.self::TABLENAME.(!empty($sArg) ? ' '.$sArg : null);

            $rData = $this->oLicMySQL->fQuery($sReqSltAll);
        }

        // On met en forme les données
        $aData = $this->oLicMySQL->fFetch($rData); <--- LINE 112

        // Si on a des données
        if(!empty($aData)) {

            // Parcours les données
            while($sValue = $aData) {

                // Retourne un nouvel objet licence
                return new cLicences($sValue[self::$sFieldID]);
            }
        }

    }

}

这是我的页面:

// Affiche les erreurs
error_reporting(E_ALL);

// Change le dossier courant
chdir('../../../');

// Fichier requis pour traitement
require_once('./configuration/general.conf.php');
require_once(PATH_CONFIGURATION.'user.conf.php');
require_once(PATH_CLASS.'mysqli.class.php');
require_once(PATH_MODULES.'licencesManager/langages/'.SITE_LANG.'.lang.php');
require_once(PATH_MODULES.'licencesManager/classes/licences.class.php');

// Nouvelle connexion à la db
$oMySQL = new cMySQLi(DB_USERNAME,DB_PASSWORD,DB_HOSTNAME,DB_HOSTPORT,DB_DATABASE);

// Initialise la classe licence
$oLicences = new cLicences();

// Récupération de toutes les licences
$sReqSelectLicence = "SELECT id_licence
                        FROM t_licences";

$rLicences = $oMySQL->fQuery($sReqSelectLicence);

// Affiche les infos de la licence
while($oLicence = cLicences::getAll($rLicences)) {
    echo '<tr>
            <td>'.$oLicence->iLicID.'</td>
            <td>'.$oLicence->sLicProduct.'</td>
            <td>
                <button onclick="fShowLicence('.$oLicence->iLicID.')" class="btn btn-xs btn-primary">
                    <i class="fa fa-key hidden-xs"></i> '.$_SESSION['mdlLicShow'].'
                </button>
            </td>
            <td><i class="fa fa-pencil"></i> <i class="fa fa-trash-o"></i></td>
        </tr>';
}

// Ferme la connexion à la base de données
$oMySQL->fClose();

这是完整的错误:

致命错误:在第 112[=31= 行 /srv/www/htdocs/dev/php/TEST/DAS/iRat-tools/modules/licencesManager/classes/licences.class.php 中不在对象上下文中时使用 $this ]

我已经被这个问题困了 3 天了。如果有人能帮我找到解决办法。

您正在静态调用 getAll(),因此对象上下文错误:PHP 期望 getAll() 被定义为 class [=14= 中的静态函数].

在您的页面中,更改此行:

while($oLicence = cLicences::getAll($rLicences)) {

为此:

while($oLicence = $oLicences->getAll($rLicences)) {

您现在正在对 cLicenses class 对象调用 getAll(),该对象之前在您的页面中定义。

这是问题所在:

while($oLicence = cLicences::getAll($rLicences)) {

您正在尝试静态访问 getAll 方法,而不是在 class(对象)的实例上调用它。因此,当您在内部使用 $this 时,您必须在此方法调用中对象上下文。

您应该将其更改为对您已经创建的对象调用方法。:

while($oLicence = $cLicences->getAll($rLicences)) {