metodo - self php
Mensaje de error Estándares estrictos: el método no estático no se debe llamar estáticamente en php (7)
Creo que esto puede responder a tu pregunta.
El método no estático ..... no debe llamarse estáticamente
Si el método no es estático, debe inicializarlo de la siguiente manera:
$var = new ClassName();
$var->method();
O bien, en PHP 5.4, puede usar esta sintaxis:
(new ClassName)->method();
Tengo el siguiente php. Sin embargo, cuando veo el index.php aparece el siguiente mensaje de error.
Estándares estrictos: el método no estático Page :: getInstanceByName () no debe llamarse estáticamente en /var/www/webworks/index.php en la línea 12
Espero que alguien me diga cómo solucionar el problema.
Gracias por adelantado.
index.php
// { common variables and functions
include_once(''ww.incs/common.php'');
$page=isset($_REQUEST[''page''])?$_REQUEST[''page'']:'''';
$id=isset($_REQUEST[''id''])?(int)$_REQUEST[''id'']:0;
...
// { get current page id
if(!$id){
if($page){ // load by name
$r=Page::getInstanceByName($page);
if($r && isset($r->id))$id=$r->id;
}
if(!$id){ // else load by special
$special=1;
if(!$page){
$r=Page::getInstanceBySpecial($special);
if($r && isset($r->id))$id=$r->id;
}
}
}
// { load page data
if($id){
$PAGEDATA=(isset($r) && $r)?$r : Page::getInstance($id);
}
else{
echo ''404 thing goes here'';
exit;
}
...
...
ww.incs / common.php
<?php
require dirname(__FILE__).''/basics.php'';
...
...
ww.incs / basics.php
session_start();
if(!function_exists(''__autoload'')){
function __autoload($name) {
require $name . ''.php'';
}
}
...
...
Page.php
class Page{
static $instances = array();
static $instancesByName = array();
static $instancesBySpecial = array();
function __construct($v,$byField=0,$fromRow=0,$pvq=0){
# byField: 0=ID; 1=Name; 3=special
if (!$byField && is_numeric($v)){ // by ID
$r=$fromRow?$fromRow:($v?dbRow("select * from pages where id=$v limit 1"):array());
}
else if ($byField == 1){ // by name
$name=strtolower(str_replace(''-'',''_'',$v));
$fname=''page_by_name_''.md5($name);
$r=dbRow("select * from pages where name like ''".addslashes($name)."'' limit 1");
}
else if ($byField == 3 && is_numeric($v)){ // by special
$fname=''page_by_special_''.$v;
$r=dbRow("select * from pages where special&$v limit 1");
}
else return false;
if(!count($r || !is_array($r)))return false;
if(!isset($r[''id'']))$r[''id'']=0;
if(!isset($r[''type'']))$r[''type'']=0;
if(!isset($r[''special'']))$r[''special'']=0;
if(!isset($r[''name'']))$r[''name'']=''NO NAME SUPPLIED'';
foreach ($r as $k=>$v) $this->{$k}=$v;
$this->urlname=$r[''name''];
$this->dbVals=$r;
self::$instances[$this->id] =& $this;
self::$instancesByName[preg_replace(''/[^a-z0-9]/'',''-'',strtolower($this->urlname))] =& $this;
self::$instancesBySpecial[$this->special] =& $this;
if(!$this->vars)$this->vars=''{}'';
$this->vars=json_decode($this->vars);
}
function getInstance($id=0,$fromRow=false,$pvq=false){
if (!is_numeric($id)) return false;
if (!@array_key_exists($id,self::$instances)) self::$instances[$id]=new Page($id,0,$fromRow,$pvq);
return self::$instances[$id];
}
function getInstanceByName($name=''''){
$name=strtolower($name);
$nameIndex=preg_replace(''#[^a-z0-9/]#'',''-'',$name);
if(@array_key_exists($nameIndex,self::$instancesByName))return self::$instancesByName[$nameIndex];
self::$instancesByName[$nameIndex]=new Page($name,1);
return self::$instancesByName[$nameIndex];
}
function getInstanceBySpecial($sp=0){
if (!is_numeric($sp)) return false;
if (!@array_key_exists($sp,$instancesBySpecial)) $instancesBySpecial[$sp]=new Page($sp,3);
return $instancesBySpecial[$sp];
}
En lugar de usar la instancia con el operador de resolución de alcance :: porque no se definió como función estática.
$r=Page::getInstanceByName($page);
cambiarlo a:
$r=Page->getInstanceByName($page);
Y funcionará como un encanto.
Prueba esto:
$r = Page()->getInstanceByName($page);
Me funcionó en un caso similar.
Si la resolución de ámbito :: se tuvo que usar fuera de la clase, entonces la función o variable respectiva se debe declarar como estática
class Foo {
//Static variable
public static $static_var = ''static variable'';
//Static function
static function staticValue() { return ''static function''; }
//function
function Value() { return ''Object''; }
}
echo Foo::$static_var . "<br/>"; echo Foo::staticValue(). "<br/>"; $foo = new Foo(); echo $foo->Value();
Sus métodos faltan la palabra clave static
. Cambio
function getInstanceByName($name=''''){
a
public static function getInstanceByName($name=''''){
si quieres llamarlos estáticamente
Tenga en cuenta que los métodos estáticos (y Singletons ) son mortales para la capacidad de prueba .
También tenga en cuenta que está haciendo demasiado trabajo en el constructor, especialmente todas las consultas que no deberían estar allí. Todo lo que su constructor debe hacer es establecer el objeto en un estado válido. Si tiene que obtener datos de fuera de la clase, considere inyectarlo en lugar de extraerlo. También tenga en cuenta que los constructores no pueden devolver nada. Siempre regresarán vacíos, por lo que todas estas return false
no harán más que terminar la construcción.
use className-> function (); en su lugar className :: function ();
return false
generalmente tiene como objetivo terminar la creación del objeto con un error. Es tan simple como eso.