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)) {
我想为许可证管理器创建一个 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)) {