doucou19961205 2015-06-30 07:52
浏览 48
已采纳

PHP:“致命错误:在不在对象上下文中时使用$ this”[重复]

This question already has an answer here:

I want to create a class for a license manager , however , I have to use another class to do what I need is to create a new connection to the database in the __construct class .

When I try to use a function , getAll in this case , I have a PHP error that appears on the screen :

Fatal error: Using $ this WHEN NOT in object context in [...] line 112 .

Here is my 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]);
            }
        }

    }

}

Here is my page:

// 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();

Here is the full error:

Fatal error: Using $this when not in object context in /srv/www/htdocs/dev/php/TEST/DAS/iRat-tools/modules/licencesManager/classes/licences.class.php on line 112

I 'm stuck on this problem for 3 days now. If anyone can help me to find a solution.

</div>
  • 写回答

2条回答 默认 最新

  • dtu36380 2015-06-30 08:01
    关注

    Here's the problem:

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

    You're trying to access getAll method statically instead of calling it on an instance of the class (object). Therefore you have to object context in this method call, while you're using $this inside.

    You should just change it to call method on object that you have already created anyway.:

    while($oLicence = $cLicences->getAll($rLicences)) {
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)