variable metodo php static-members

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.