Home > OS >  PHP mapping strings to classnames in a model
PHP mapping strings to classnames in a model

Time:11-05

Im wondering if its possible to init a class from a 'mapping' in a PHP model.

For instance, in a model, if I map strings to class names in an array, can i then pass a string to map to a specific class and then initialise it, if that makes sense.

In my model if I have an array;

public const $mappingArray = [
  'first-string-name-here' => 'FirstClassName',
  'second-string-name-here' => 'SecondClassName',
];

Would it be possible to pass the string in a controller method and receive a class;

CodePudding user response:

Yes, it's possible to create a mapping of strings to class names in PHP and then dynamically instantiate a class based on a string in a controller method. You can use PHP's built-in class_exists() and new operators to achieve this.

Here's an example of how you can do it:

In your model:

class YourModel {
    public const $mappingArray = [
        'first-string-name-here' => 'FirstClassName',
        'second-string-name-here' => 'SecondClassName',
    ];
}

In your controller method:

public function createInstanceFromClassString($classString) {
    if (array_key_exists($classString, YourModel::$mappingArray)) {
        $className = YourModel::$mappingArray[$classString];

        if (class_exists($className)) {
            return new $className();
        } else {
            // Handle the case where the class doesn't exist
            // You might want to throw an exception or return an error message
            return null;
        }
    } else {
        // Handle the case where the string is not in the mapping
        // You might want to throw an exception or return an error message
        return null;
    }
}

You can call the createInstanceFromClassString method in your controller, passing the string you want to map to a class:

$className = $yourModelInstance->createInstanceFromClassString('first-string-name-here');
if ($className) {
    // $className is now an instance of the mapped class
    // You can use it as needed
} else {
    // Handle the error case
}

This way, you can dynamically create instances of classes based on the strings you provide, as long as they are mapped in your model's mapping array.

CodePudding user response:

You can map strings to class names and then instantiate those classes dynamically in PHP. Here's how you can achieve this:

Define Your Classes:

class FirstClassName {
 public function sayHello() {
    return "Hello from FirstClassName!";
 }
}

class SecondClassName {
 public function sayHello() {
    return "Hello from SecondClassName!";
 }
}

Model with Mapping Array:

class Model {
 public const MAPPING_ARRAY = [
    'first-string-name-here' => 'FirstClassName',
    'second-string-name-here' => 'SecondClassName',
 ];
}

Controller Method to Instantiate Class:

function instantiateClassFromMapping($stringKey) {
  if (isset(Model::MAPPING_ARRAY[$stringKey])) {
    $className = Model::MAPPING_ARRAY[$stringKey];
    if (class_exists($className)) {
        return new $className();
    } else {
        throw new Exception("Class {$className} does not exist.");
    }
} else {
    throw new Exception("String key {$stringKey} not found in mapping.");
}
}

Usage:

try {
    $instance = instantiateClassFromMapping('first-string-name-here');
    echo $instance->sayHello();  // Outputs: Hello from FirstClassName!
} catch (Exception $e) {
    echo $e->getMessage();
}

This way, you can map strings to class names in your model and then use those mappings to dynamically instantiate classes in your controller.

  • Related