>백엔드 개발 >PHP 튜토리얼 >마치 객체인 것처럼 변수를 사용하여 작업

마치 객체인 것처럼 변수를 사용하여 작업

Barbara Streisand
Barbara Streisand원래의
2025-01-06 06:33:40297검색

Trabajar con variables como si fuesen objetos

본 글은 개인적인 의견이며 어떠한 내용도 언급하려는 것이 아닙니다.

Ruby나 JavaScript와 같은 언어에서 제가 가장 좋아하는 점 중 하나는 해당 언어의 변수가 객체라는 것입니다. 어떤 측면에서는 코드가 훨씬 더 읽기 쉽고 어떤 측면에서는 그렇지 않을 때도 있습니다.

예를 들면 다음과 같습니다.

# Ruby Program for length method.
str = "Hello, world!"
puts str.length # prints 13 to the console

PHP에서는

$str = 'Hello, world!';
echo strlen($str);

그렇지만 내 관점에서는 변수가 주어이고 메소드가 술어가 되기 때문에 Ruby나 JavaScript 형식이 더 읽기 쉽습니다.

PHP는 이러한 코드 작성 방식을 지원하지 않기 때문에 이를 수행할 수 있는 클래스를 만들었습니다. 그러나 클래스의 목적은 플레이만을 위한 것이며 프로덕션에서는 사용할 수 없습니다. 성능 문제가 있습니다.

<?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;
  }
}




잘 작동하려면 변수 이름 앞에 변수를 작성하는 기능을 사용해야 한다는 점을 명심하는 것도 중요합니다

<?PHP
$data = new CustomerData(
    name: $input['name'],
    email: $input['email'],
    age: $input['age'],
);

단일 매개변수 함수가 있는 클래스와 여러 매개변수가 있는 함수를 사용하는 예:

<?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();
}

위 내용은 마치 객체인 것처럼 변수를 사용하여 작업의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.