>= 5.5
::class
fully qualified class name, instead of get_class
<?php
namespace my\library\mvc;
class Dispatcher {}
print Dispatcher::class; // FQN == my\library\mvc\Dispatcher
$disp = new Dispatcher;
print $disp::class; // parse error(PHP 4, PHP 5, PHP 7, PHP 8)
get_class — Devuelve el nombre de la clase de un objeto
Devuelve el nombre de la clase del objeto obj.
Devuelve el nombre de la clase de la cual object
es una instancia.
Si object es una instancia de una clase que existe
en un espacio de nombres, el nombre con el espacio de nombres de la clase será devuelto.
Si get_class() es llamada con algo que no sea un objeto,
se levanta una TypeError. Anteriormente a PHP 8.0.0,
se emitía una advertencia de nivel E_WARNING.
Si get_class() es llamado sin argumento fuera de una
clase, se levanta una Error. Anteriormente a PHP 8.0.0,
se emitía una advertencia de nivel E_WARNING.
| Versión | Descripción |
|---|---|
| 8.3.0 |
Llamar a get_class() sin argumento ahora desencadena una advertencia
E_DEPRECATED; previamente, llamar a esta función dentro de una clase devolvía el nombre de esa clase.
|
| 8.0.0 |
Llamar a esta función desde fuera de una clase ahora lanza una Error.
Anteriormente, se generaba un E_WARNING y la función devolvía false.
|
| 7.2.0 |
Anteriormente a esta versión, el valor por omisión para
object era null y tenía el mismo efecto que
no pasar ningún valor. Ahora null ya no es el valor por omisión
para object, y ya no es una entrada válida.
|
Ejemplo #1 Ejemplo con get_class()
<?php
class foo {
function name()
{
echo "Mi nombre es " , get_class($this) , "\n";
}
}
// creación de un objeto
$bar = new foo();
// Llamada externa
echo "Su nombre es " , get_class($bar) , "\n";
// Llamada interna
$bar->name();
?>El ejemplo anterior mostrará:
Su nombre es foo Mi nombre es foo
Ejemplo #2 Uso de get_class() en una superclase
<?php
abstract class bar {
public function __construct()
{
var_dump(get_class($this));
var_dump(get_class());
}
}
class foo extends bar {
}
new foo;
?>El ejemplo anterior mostrará:
string(3) "foo" string(3) "bar"
Ejemplo #3 Uso de get_class() con espacios de nombres de clase
<?php
namespace Foo\Bar;
class Baz {
public function __construct()
{
}
}
$baz = new \Foo\Bar\Baz;
var_dump(get_class($baz));
?>El ejemplo anterior mostrará:
string(11) "Foo\Bar\Baz"
>= 5.5
::class
fully qualified class name, instead of get_class
<?php
namespace my\library\mvc;
class Dispatcher {}
print Dispatcher::class; // FQN == my\library\mvc\Dispatcher
$disp = new Dispatcher;
print $disp::class; // parse errorA lot of people in other comments wanting to get the classname without the namespace. Some weird suggestions of code to do that - not what I would've written! So wanted to add my own way.
<?php
function get_class_name($classname)
{
if ($pos = strrpos($classname, '\\')) return substr($classname, $pos + 1);
return $pos;
}
?>
Also did some quick benchmarking, and strrpos() was the fastest too. Micro-optimisations = macro optimisations!
39.0954 ms - preg_match()
28.6305 ms - explode() + end()
20.3314 ms - strrpos()
(For reference, here's the debug code used. c() is a benchmarking function that runs each closure run 10,000 times.)
<?php
c(
function($class = 'a\b\C') {
if (preg_match('/\\\\([\w]+)$/', $class, $matches)) return $matches[1];
return $class;
},
function($class = 'a\b\C') {
$bits = explode('\\', $class);
return end($bits);
},
function($class = 'a\b\C') {
if ($pos = strrpos($class, '\\')) return substr($class, $pos + 1);
return $pos;
}
);
?>People seem to mix up what __METHOD__, get_class($obj) and get_class() do, related to class inheritance.
Here's a good example that should fix that for ever:
<?php
class Foo {
function doMethod(){
echo __METHOD__ . "\n";
}
function doGetClassThis(){
echo get_class($this).'::doThat' . "\n";
}
function doGetClass(){
echo get_class().'::doThat' . "\n";
}
}
class Bar extends Foo {
}
class Quux extends Bar {
function doMethod(){
echo __METHOD__ . "\n";
}
function doGetClassThis(){
echo get_class($this).'::doThat' . "\n";
}
function doGetClass(){
echo get_class().'::doThat' . "\n";
}
}
$foo = new Foo();
$bar = new Bar();
$quux = new Quux();
echo "\n--doMethod--\n";
$foo->doMethod();
$bar->doMethod();
$quux->doMethod();
echo "\n--doGetClassThis--\n";
$foo->doGetClassThis();
$bar->doGetClassThis();
$quux->doGetClassThis();
echo "\n--doGetClass--\n";
$foo->doGetClass();
$bar->doGetClass();
$quux->doGetClass();
?>
OUTPUT:
--doMethod--
Foo::doMethod
Foo::doMethod
Quux::doMethod
--doGetClassThis--
Foo::doThat
Bar::doThat
Quux::doThat
--doGetClass--
Foo::doThat
Foo::doThat
Quux::doThatIf you are using namespaces this function will return the name of the class including the namespace, so watch out if your code does any checks for this. Ex:
namespace Shop;
<?php
class Foo
{
public function __construct()
{
echo "Foo";
}
}
//Different file
include('inc/Shop.class.php');
$test = new Shop\Foo();
echo get_class($test);//returns Shop\Foo
?>Simplest way how to gets Class without namespace
<?php
namespace a\b\c\d\e\f;
class Foo {
public function __toString() {
$class = explode('\\', __CLASS__);
return end($class);
}
}
echo new Foo(); // prints Foo