PHP 5.6.0beta1 released

class_alias

(PHP 5 >= 5.3.0)

class_aliasCrée un alias de classe

Description

bool class_alias ( string $original , string $alias [, bool $autoload = TRUE ] )

Crée un alias appelé alias basé sur une classe original définie par l'utilisateur. L'alias est en tous points similaire à la classe originale.

Liste de paramètres

original

La classe originale.

alias

Le nom de l'alias de la classe.

autoload

Si l'on doit charger automatiquement si la classe originale n'est pas trouvée.

Valeurs de retour

Cette fonction retourne TRUE en cas de succès ou FALSE si une erreur survient.

Exemples

Exemple #1 Exemple avec class_alias()

<?php

class foo { }

class_alias('foo''bar');

$a = new foo;
$b = new bar;

// les objets sont les mêmes
var_dump($a == $b$a === $b);
var_dump($a instanceof $b);

// les classes sont les mêmes
var_dump($a instanceof foo);
var_dump($a instanceof bar);

var_dump($b instanceof foo);
var_dump($b instanceof bar);

?>

L'exemple ci-dessus va afficher :

bool(true)
bool(false)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)

Voir aussi

add a note add a note

User Contributed Notes 9 notes

up
1
programmer-comfreek at hotmail dot com
2 years ago
If you defined the class 'original' in a namespace, you will have to specify the namespace(s), too:
<?php
namespace ns1\ns2\ns3;

class
A {}

class_alias('ns1\ns2\ns3\A', 'B');
/* or if you want B to exist in ns1\ns2\ns3 */
class_alias('ns1\ns2\ns3\A', 'ns1\ns2\ns3\B');
?>
up
1
nicolas dot grekas+php at gmail dot com
3 years ago
At first, you might wonder that:
<?php class A {}; class_alias('A', 'B'); ?>

is equivalent to:
<?php class A {}; class B extends A {}; ?>

BUT when derivation creates a new class name - that means, you can then instantiate a new kind of objects - aliasing is just what it says: a synonym, so objects instantiated with the aliased name are of the exact same kind of objects instantiated with the non-aliased name.

See this code for example:
<?php
class A {};
class
B1 extends A {};
class_alias('A', 'B2');

$b1 = new B1; echo get_class($b1); // prints B1
$b2 = new B2; echo get_class($b2); // prints A !
?>
up
1
mweierophinney at gmail dot com
1 year ago
class_alias() gives you the ability to do conditional imports.

Whereas the following will not work:

<?php
namespace Component;

if (
version_compare(PHP_VERSION, '5.4.0', 'gte')) {
    use
My\ArrayObject;
} else {
    use
ArrayObject;
}

class
Container extends ArrayObject
{
}
?>

the following, using class_alias, will:

<?php
namespace Component;

if (
version_compare(PHP_VERSION, '5.4.0', 'lt')) {
   
class_alias('My\ArrayObject', 'Component\ArrayObject');
} else {
   
class_alias('ArrayObject', 'Component\ArrayObject');
}

class
Container extends ArrayObject
{
}
?>

The semantics are slightly different (I'm now indicating that Container extends from an ArrayObject implementation in the same namespace), but the overall idea is the same: conditional imports.
up
1
sergey dot karavay at gmail dot com
1 year ago
At first, you might wonder that:
<?php class A {}; class_alias('A', 'B'); ?>

is equivalent to:
<?php class A {}; class B extends A {}; ?>

class_alias is NOT equivalent to class extending! Private methods/properties are unseen in child classes, but in alias classes they are.
up
0
Anonymous
1 year ago
Like class_alias but for functions:

<?php
function function_alias ($original, $alias) {
 
 
$args = func_get_args();
 
assert('count($args) == 2', 'function_alias() require exactly two arguments');
 
assert('is_string($original) && is_string($alias)', 'function_alias() require string arguments');
 
 
// valid function name - http://php.net/manual/en/functions.user-defined.php
 
assert('preg_match(\'/^[a-zA-Z_\x7f-\xff][\\\\\\\\a-zA-Z0-9_\x7f-\xff]*$/\', $original) > 0',
   
"'$original' is not a valid function name");
 
assert('preg_match(\'/^[a-zA-Z_\x7f-\xff][\\\\\\\\a-zA-Z0-9_\x7f-\xff]*$/\', $alias) > 0',
   
"'$alias' is not a valid function name");
 
 
$aliasNamespace = substr($alias, 0, strrpos($alias, '\\') !== false ? strrpos($alias, '\\') : 0);
 
$aliasName = substr($alias, strrpos($alias, '\\') !== false ? strrpos($alias, '\\') + 1 : 0);
 
$serializedOriginal = var_export($original, true);
 
  eval(
"
    namespace
$aliasNamespace {
      function
$aliasName () {
        return call_user_func_array(
$serializedOriginal, func_get_args());
      }
    }
  "
);
 
}

?>

Until hopefully function_alias is added to php...
up
0
adam at adamhahn dot com
2 years ago
Something to note,

If the $original class has not yet been defined or loaded, the auto loader will be invoked in order to try and load it.

If the class for which you are trying to create an alias does not exist, or can not be loaded with the auto loader, you will generate a PHP Warning.
up
0
nicolas dot grekas+php at gmail dot com
3 years ago
class_alias also works for interfaces!

<?php
interface foo {}
class_alias('foo', 'bar');
echo
interface_exists('bar') ? 'yes!' : 'no'; // prints yes!
?>
up
-1
petar dot karan dot pk at gmail dot com
2 months ago
If you need the same function in PHP version < 5.3 you can use this

<?php
function class_alias($original,$alias) {
   
$newclass = create_function('','class '.$alias.' extends '.$original.' {}');
   
$newclass();
}
?>
up
-1
paul [dot] kotets [at] gmail [dot] com
4 years ago
This function will appear in PHP 5.3 (at least I can use it with PHP 5.3, build Aug 7 2009 08:21:14)
For older versions of PHP I wrote the next function:

<?php
if (!function_exists('class_alias')) {
    function
class_alias($original, $alias) {
        eval(
'abstract class ' . $alias . ' extends ' . $original . ' {}');
    }
}
?>

Keyword 'abstract' is used for classes, which defines abstract methods.
This function is used in autoload purposes (when I extend classes), so abstract keyword doesn't broke anything for me.
To Top