ホームページ > バックエンド開発 > PHPチュートリアル > 変数をオブジェクトであるかのように操作する

変数をオブジェクトであるかのように操作する

Barbara Streisand
リリース: 2025-01-06 06:33:40
オリジナル
250 人が閲覧しました

Trabajar con variables como si fuesen objetos

この記事は個人的な意見であり、何かについて発言するつもりはありません。

Ruby や JavaScript のような言語で私が最も気に入っている点の 1 つは、それらの変数がオブジェクトであることです。コードは、ある面でははるかに読みやすいと思いますが、他の面ではそれほど読みにくいと感じます。

例としては次のとおりです。

# 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート