una - self php 7
Obtener una propiedad estática de una instancia (8)
Debes entender lo que significa la propiedad estática. La propiedad o método estático no es para los objetos. Son utilizados directamente por la clase.
puedes acceder a ellos por
Class_name::static_property_name
Si tengo una instancia en PHP, ¿cuál es la forma más fácil de llegar a una propiedad estática (''variable de clase'') de esa instancia?
Esta
$classvars=get_class_vars(get_class($thing));
$property=$classvars[''property''];
Sonido realmente exagerado. Yo esperaría
$thing::property
o
$thing->property
Desde dentro de una instancia de clase puedes simplemente usar self::...
class Person {
public static $name = ''Joe'';
public function iam() {
echo ''My name is '' . self::$name;
}
}
$me = new Person();
$me->iam(); // displays "My name is Joe"
En estos días, hay una manera bastante simple y limpia de hacer esto.
<?php
namespace Foo;
class Bar
{
public static $baz=1;
//...
public function __toString()
{
return self::class;
}
}
echo Bar::$baz; // returns 1
$bar = new Bar();
echo $bar::$baz; // returns 1
También puedes hacer esto con una propiedad en PHP 7.
<?php
namespace Foo;
class Bar
{
public static $baz=1;
public $class=self::class;
//...
}
$bar = new Bar();
echo $bar->class::$baz; // returns 1
Necesitas buscar primero el nombre de la clase:
$class = get_class($thing);
$class::$property
$ propiedad debe definirse como static
y public
por supuesto.
Puede acceder a ellos utilizando el doble colon (o la ficha T_PAAMAYIM_NEKUDOTAYIM
si lo prefiere)
class X {
public static $var = 13;
}
echo X::$var;
Las variables variables son compatibles aquí, también:
$class = ''X'';
echo $class::$var;
Si prefieres no
$class = get_class($instance);
$var = $class::$staticvar;
Porque encuentras que sus dos líneas son demasiado largas, tienes otras opciones disponibles:
1. Escribe un captador
<?php
class C {
static $staticvar = "STATIC";
function getTheStaticVar() {
return self::$staticvar;
}
}
$instance = new C();
echo $instance->getTheStaticVar();
Simple y elegante, pero tendría que escribir un captador para cada variable estática a la que está accediendo.
2. Escribe un captador de estática universal.
<?php
class C {
static $staticvar = "STATIC";
function getStatic($staticname) {
return self::$$staticname;
}
}
$instance = new C();
echo $instance->getStatic(''staticvar'');
Esto te permitirá acceder a cualquier estática, aunque aún es un poco largo.
3. Escribe un método mágico
class C {
static $staticvar = "STATIC";
function __get($staticname) {
return self::$$staticname;
}
}
$instance = new C();
echo $instance->staticvar;
Éste le permite acceder a cualquier variable estática como si fuera una variable local del objeto, pero puede considerarse una abominación impía.
class testClass {
public static $property = "property value";
public static $property2 = "property value 2";
}
echo testClass::$property;
echo testClass::property2;
classname::property;
Creo que eso es todo.