Maison > développement back-end > tutoriel php > Travailler avec des variables comme s'il s'agissait d'objets

Travailler avec des variables comme s'il s'agissait d'objets

Barbara Streisand
Libérer: 2025-01-06 06:33:40
original
244 Les gens l'ont consulté

Trabajar con variables como si fuesen objetos

Cet article est une opinion personnelle et je n'essaie pas de parler de quoi que ce soit.

L'une des choses que j'aime le plus dans les langages comme Ruby ou JavaScript est que leurs variables sont des objets, je trouve le code beaucoup plus lisible sous certains aspects, d'autres fois moins.

Un exemple serait.

# Ruby Program for length method.
str = "Hello, world!"
puts str.length # prints 13 to the console
Copier après la connexion

Alors qu'en PHP c'est le cas

$str = 'Hello, world!';
echo strlen($str);
Copier après la connexion

Cela dit, de mon point de vue le formulaire Ruby ou JavaScript est plus lisible car ce serait la variable qui serait le sujet et la méthode serait le prédicat.

PHP ne supporte pas cette façon d'écrire du code et c'est pourquoi j'ai créé une classe qui permet de le faire, mais le but de la classe est uniquement de jouer, elle n'est pas destinée à être utilisée en production comme elle peut avez des problèmes de performances

<?php

namespace Scalar;

use Exception;
use ReflectionFunction;

class Scalar {

  /**
   * @var mixed
   * Value that can only be scalar.
   */
  private $Scalar;

  /**
   * Constructor: Initializes the Scalar object.
   * @param mixed $Scalar
   * @throws Exception if the value is not scalar.
   */
  public function __construct($Scalar) {
    if (!is_scalar($Scalar)) {
      throw new Exception('It\'s not a scalar value');
    }
    $this->Scalar = $Scalar;
  }

  /**
   * Magic method: Dynamically calls a PHP function with the scalar value.
   * Supports named parameters if provided as an associative array.
   * @param string $method The name of the function to call.
   * @param array $arguments Additional arguments for the function.
   * @return mixed The result of the function call.
   * @throws Exception if the function does not exist.
   */
  public function __call($method, $arguments) {
    if (!function_exists($method)) {
      throw new Exception('The function called ' . $method . ' doesn\'t exist');
    }

    // Verificar si los argumentos son asociativos (named parameters)
    if (!empty($arguments) && array_keys($arguments) !== range(0, count($arguments) - 1)) {
      $refFunc = new ReflectionFunction($method);
      $params = $refFunc->getParameters();

      $mappedArgs = [];
      foreach ($params as $param) {
        $name = $param->getName();
        if (isset($arguments[$name])) {
          // Asignar el valor proporcionado
          $mappedArgs[] = $arguments[$name];
        } elseif ($name === 'data') {
          // Insertar $this->Scalar si el parámetro es 'data'
          $mappedArgs[] = $this->Scalar;
        } elseif ($param->isDefaultValueAvailable()) {
          // Usar el valor predeterminado si está disponible
          $mappedArgs[] = $param->getDefaultValue();
        } else {
          // Parámetro requerido sin valor proporcionado
          throw new Exception("Missing required parameter: $name for function $method");
        }
      }

      return $refFunc->invokeArgs($mappedArgs);
    } else {
      // Llamada con argumentos posicionales (por defecto, insertar scalar al inicio)
      array_unshift($arguments, $this->Scalar);
      return call_user_func_array($method, $arguments);
    }
  }

  /**
   * Get the scalar value.
   * @return mixed
   */
  public function getScalar() {
    return $this->Scalar;
  }
}




Copier après la connexion

Il est également important de garder à l'esprit que pour que cela fonctionne bien il est nécessaire d'utiliser la fonctionnalité d'écriture des variables avec leur nom devant

<?PHP
$data = new CustomerData(
    name: $input['name'],
    email: $input['email'],
    age: $input['age'],
);
Copier après la connexion

Un exemple d'utilisation de la classe avec une fonction à un seul paramètre et une fonction à plusieurs paramètres :

<?PHP
try {
    $a = 'hola mundo';
    $a_object = new Scalar($a);

    // Llamar a la función hash con named parameters
    $result = $a_object->hash(algo: 'sha256', binary: true);
    echo $result; // Hash binario de 'hola mundo'

    // Llamar a otras funciones
    echo $a_object->strlen(); // Devuelve 10 (longitud de 'hola mundo')
} catch (Exception $e) {
    echo 'Error: ' . $e->getMessage();
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal