get_class

(PHP 4, PHP 5, PHP 7, PHP 8)

get_classDevuelve el nombre de la clase de un objeto

Descripción

function get_class(object $object = ?): string

Devuelve el nombre de la clase del objeto obj.

Parámetros

object

El objeto probado.

Nota:

Pasar explícitamente null en object ya no es permitido desde PHP 7.2.0 y emite una E_WARNING. A partir de PHP 8.0.0, se emite una TypeError cuando null es utilizado.

Valores devueltos

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.

Errores/Excepciones

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.

Historial de cambios

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.

Ejemplos

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"

Véase también

add a note

User Contributed Notes 37 notes

up
68
jjanak at webperfection dot net
11 years ago
>= 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
up
32
dave at shax dot com
12 years ago
A 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;
    }
);
?>
up
18
mail dot temc at gmail dot com
14 years ago
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::doThat
up
7
ovidiu.bute [at] gmail.com
16 years ago
If 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
?>
up
2
ozana at omdesign dot cz
14 years ago
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