2013-02-27 19 views
57
public class MyClass { 

} 

In Java, siamo in grado di ottenere il nome di classe con String className = MyClass.class.getSimpleName();Come posso ottenere il nome della classe in PHP?

Come fare questo in PHP? Conosco già lo get_class(), ma funziona solo per gli oggetti. Attualmente lavoro in Active Record. Ho bisogno di una dichiarazione come MyClass::className.

+1

Potrebbe fare un esempio particolare quando potrebbe essere utile in php? Se hai codificato il nome della classe, puoi racchiuderlo tra virgolette e ottenere ciò che desideri. – zerkms

+1

Sfortunatamente i rifacimenti automatici (ad esempio negli IDE) come RenameClass di solito non rinominano le stringhe di questo nome di classe. Quindi sarebbe bello avere un qualche tipo di modo statico per ottenere il nome della classe, a parte il 'public $ __ CLASS__ = __CLASS __;' balla con ogni altra classe ... – EricSchaefer

+1

Possibile duplicato di [Come posso ottenere il nome della classe da una chiamata statica in una classe PHP estesa?] (https://stackoverflow.com/questions/506705/how-can-i-get-the-classname-from-a-static-call-in-an-extended-php -class) – Theraot

risposta

68

partire da PHP 5.5 è possibile utilizzare la risoluzione dei nomi di classe tramite ClassName :: classe.

Vedere new features of PHP5.5.

<?php 

namespace Name\Space; 

class ClassName {} 

echo ClassName::class; 

?> 

Se si desidera utilizzare questa funzione nel vostro metodo di classe utilizzare statica :: classe:

<?php 

namespace Name\Space; 

class ClassName { 
    /** 
    * @return string 
    */ 
    public function getNameOfClass() 
    { 
     return static::class; 
    } 
} 

$obj = new ClassName(); 
echo $obj->getNameOfClass(); 

?> 

Per le vecchie versioni di PHP, è possibile utilizzare get_class().

+0

Qual è la differenza tra 'static :: class' e' get_class_name() '? –

21

È possibile utilizzare __CLASS__ all'interno di una classe per ottenere il nome.

http://php.net/manual/en/language.constants.predefined.php

+2

puoi anche dare un'occhiata qui per visualizzare tutti i const interessanti: http://php.net/manual/en/language.constants.predefined.php – MatRt

+0

Grazie a @Brad per il link, trovo la risposta [ qui] (http://www.php.net/manual/en/language.constants.predefined.php#84050) –

+2

@ user1073122, Questo è il link a cui mi sono collegato nella mia risposta. – Brad

10

Sembra che si risposto alla tua domanda. get_class otterrai il nome della classe. È procedurale e forse è ciò che sta causando la confusione. Date un'occhiata alla documentazione di PHP per get_class

Ecco il loro esempio:

<?php 

class foo 
{ 
    function name() 
    { 
     echo "My name is " , get_class($this) , "\n"; 
    } 
} 

// create an object 
$bar = new foo(); 

// external call 
echo "Its name is " , get_class($bar) , "\n"; // It's name is foo 

// internal call 
$bar->name(); // My name is foo 

Per renderlo più simile a tuo esempio si potrebbe fare qualcosa di simile:

<?php 

class MyClass 
{ 
     public static function getClass() 
     { 
      return get_class(); 
     } 
} 

Ora si può fare:

$className = MyClass::getClass(); 

Questo è un po 'limitato, tuttavia, perché se la mia classe è esteso esso restituirà ancora "MyClass". Possiamo invece utilizzare get_called_class, che si basa su Late Static Binding, una funzione relativamente nuova e richiede PHP> = 5.3.

<?php 

class MyClass 
{ 
    public static function getClass() 
    { 
     return get_called_class(); 
    } 

    public static function getDefiningClass() 
    { 
     return get_class(); 
    } 
} 

class MyExtendedClass extends MyClass {} 

$className = MyClass::getClass(); // 'MyClass' 
$className = MyExtendedClass::getClass(); // 'MyExtendedClass' 
$className = MyExtendedClass::getDefiningClass(); // 'MyClass' 
+0

Grazie a J.Money per l'idea .. Ma non funziona nell'ereditarietà. –

+3

Se metti quello che vuoi nella tua domanda, allora possiamo rispondere meglio. –

10

Ora, ho una risposta per il mio problema. Grazie a Brad per il collegamento, trovo la risposta here. E grazie a J.Money per l'idea. La mia soluzione:

<?php 

class Model 
{ 
    public static function getClassName() { 
     return get_called_class(); 
    } 
} 

class Product extends Model {} 

class User extends Model {} 

echo Product::getClassName(); // "Product" 
echo User::getClassName(); // "User" 
+3

Non ha senso. 'FooBar :: getClassName()' è sempre ''FooBar''. Se potessi digitare 'Product :: getClassName()' - allora potresti anche digitare ''Product''. – zerkms

+6

Sì, lo so .. Voglio evitare errori di battitura e anche quando rifatto il nome della classe (con strumenti IDE), non ho bisogno di cercare e sostituire la stringa. –

+0

sì, ha senso – zerkms

0
<?php 
namespace CMS; 
class Model { 
    const _class = __CLASS__; 
} 

echo Model::_class; // will return 'CMS\Model' 

per più vecchio di PHP 5.5

1

Penso che sia importante ricordare poca differenza tra 'sé' e 'statico' in PHP come 'migliore risposta' usa 'statica' che può dare risultato confusione ad alcune persone

<?php 
class X { 
    function getStatic() { 
     // gets THIS class of instance of object 
     // that extends class in which is definied function 
     return static::class; 
    } 
    function getSelf() { 
     // gets THIS class of class in which function is declared 
     return self::class; 
    } 
} 

class Y extends X { 
} 
class Z extends Y { 
} 

$x = new X(); 
$y = new Y(); 
$z = new Z(); 

echo 'X:' . $x->getStatic() . ', ' . $x->getSelf() . 
    ', Y: ' . $y->getStatic() . ', ' . $y->getSelf() . 
    ', Z: ' . $z->getStatic() . ', ' . $z->getSelf(); 

Risultati:

X: X, X 
Y: Y, X 
Z: Z, X 
1
$foo = (new \ReflectionClass($this))->getShortName(); 
+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post. - [Dalla recensione] (/ recensione/post di bassa qualità/17731082) –

+0

Mentre questo frammento di codice può essere la soluzione, [inclusa una spiegazione] (// meta.stackexchange.com/questions/114762/explaining-intendely- Risposte basate sul codice) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. – yivi

Problemi correlati