shealtiel
shealtiel

Reputation: 8388

"__class magic method" (mediating references to class names by a custom code)

You can redirect calls to some properties/functions by using __get, __call.

Is there a way to do it for classes?

I would like to convert all mentions of some_class_name in the code to, MY_VERSION_some_class_name (not only for one class, it's a pattern).

This would be easy if methods / properties were the target of this renaming policy.

Can you think of a way to do it for classes in PHP?

Edit: I need this for referencing to different variants of classes in different situations. I need one class name to be resolved to different variants of this class, depending on a condition known at runtime, and persistent through the whole session.

Thanks

p.s. If you are curious why I want to do this, look at Maintaining variants of an application

Upvotes: 2

Views: 291

Answers (3)

Aiden Bell
Aiden Bell

Reputation: 28386

Aiden's untested approach: variable variables and generating a string:

<?php
$dog = "12";

function getDogClass($myNum)
{
    global $dog;
    // Do something dynamic here;
    $dog = "Dog_" . $myNum;
    return "dog";
}

class Dog_13rc1
{
    function __construct()
    {
        printf("Woof!");
    }
}

class Dog_12
{
    function __construct()
    {
        printf("Grrrr");
    }
}

$myObj = new ${getDogClass('13rc1')}();
?>

As long as the call to getDogClass() returns a string of the name of a variable in scope then you are good.

The output is woof.

This means the only refactoring you need is to find/replace occurences of the class name with that call.

But this is grim. and probably slow. Also, a maintenance/bug-tracking nightmare type of hack.

Upvotes: 1

Lukman
Lukman

Reputation: 19164

The magic function you want is __autoload:

function __autoload($class_name) {
    // include your special class in here
    include $class_name . '.php'; 
}

Read more here: http://php.net/manual/en/language.oop5.autoload.php

Upvotes: 0

Tyler Carter
Tyler Carter

Reputation: 61567

You can't convert all mentions of some_class_name in the code to another class. However, you can use variables as class names:

$className = "MyClass";
$obj = new $className;
$className::myMethod();

All you have to do is change the variable and you will be using a different class. If you have to do this for a lot of classes, you might want to create some sort of factory for it.

$factory = System::getFactory();
$obj = $factory->getAuthObj();

Basically, the System class would return a different object based on what class needed to be used for that particular run time.

Upvotes: 4

Related Questions