ホームページ >PHPフレームワーク >Laravel >魔法のメソッドとは何ですか? Laravelでの使い方

魔法のメソッドとは何ですか? Laravelでの使い方

青灯夜游
青灯夜游転載
2022-09-26 20:21:271932ブラウズ

魔法のメソッドとは何ですか? Laravelでどうやって使うの?次の記事では、Laravel で PHP のマジックメソッドを適用する方法を紹介します。

魔法のメソッドとは何ですか? Laravelでの使い方

#Laravel は PHP をまったく新しいレベルに引き上げ、次のプロジェクトに優れた開発エクスペリエンス (DX) を提供します。したがって、それを「魔法」と呼ぶ人もいます。

今日は、Laravel の裏技、Magic Method を紹介します。

魔法のメソッドとは何ですか?

マジック メソッドは Laravel に固有のものではなく、あらゆる PHP アプリケーションで使用できることを理解することが重要です。 Laravel には、マジック メソッドの最も興味深い使用例がいくつかあります。

マジック メソッドは、クラスに追加機能を実装する方法を提供する、PHP で宣言されたクラスで使用できるメソッドです。

これは良い定義です:

マジック メソッドはプログラマによって呼び出されることはありません。実際、PHP は舞台裏でこのメソッドを呼び出します。これが、これらが「魔法の」メソッドと呼ばれる理由です。これらは直接呼び出されることはなく、プログラマが非常に強力な処理を実行できるためです。

合計 15 のマジック メソッドがあります:

class MyClass
{
    public function __construct() {}

    public function __destruct() {}

    public function __call() {}

    public function __callStatic() {}

    public function __get() {}

    public function __set() {}

    public function __isset() {}

    public function __unset() {}

    public function __sleep() {}

    public function __wakeup() {}

    public function __toString() {}

    public function __invoke() {}

    public function __set_state() {}

    public function __clone() {}

    public function __debuginfo() {}
}

PHP でオブジェクト指向プログラミングを行ったことがある場合は、__construct メソッドを知っている必要があります。それは魔法のメソッドです。魔法のような方法を使ってきたんですね。

すべてのマジック メソッドには接頭辞「__」が付いていることにも気付きました。

今日はこれらのメソッドについては詳しく説明しませんが、Laravel コードベース全体で使用されている興味深いメソッドのみを取り上げます。他に興味がある人は、以下のドキュメントを自由にチェックしてください。

PHP: Méthodes magiques - Manual

Laravel はLaravel でマジックメソッド

<span style="font-size: 16px;">__get()</span>

を使用する方法モデルは非常に特別です。属性データはクラスの直接属性としてではなく、モデルが保持するすべてのデータの連想配列である protected $attributes 属性に保存されます。

単純な PHP クラスと Laravel モデルのアクセス プロパティの違いを見てみましょう。

<?php

/**
 * PHP中的普通用户类(非Laravel)将只是一个具有上述属性的类
 */
class NormalUser
{
    public $firstName = &#39;Alice&#39;;
}

$normalUser = new NormalUser;

$normalUser->firstName; // 将返回'Alice'
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

/**
 * Laravel中的一个user类
 */
class LaravelUser extends Model
{
    /**
     * 注意,我们将所有属性数据存储在一个单独的数组中
     */
    protected $attributes = [
        &#39;firstName&#39; => 'Alice',
    ];
}

$laravelUser = new LaravelUser;

$laravelUser->firstName; // 依然返回'Alice'

上記の PHP クラスと Laravel クラスはまったく同じように動作することがわかります。

ただし、Laravel の場合、属性は通常の PHP のように保存されず、$attributes と呼ばれる単一の属性に集中されます。それでも正しいデータにアクセスすることはできますが、どうすればよいでしょうか?

これはすべて、_getマジック メソッドのおかげで可能です。簡単な例を自分で実装してみましょう。

rreeee

やった! ?

マジック メソッド _get は、クラス内に一致する名前のプロパティが見つからない場合にのみ呼び出されることに注意する必要があります。これは、PHP がクラス内でアクセスされているプロパティを見つけられない場合に呼び出されるフォールバック メソッドです。したがって、以下の例では、マジック メソッド _get はまったく呼び出されません。

<?php

class NormalUser
{
    /**
     * 像在Laravel中那样声明属性
     */
    protected $attributes = [
        &#39;firstName&#39; => 'Alice',
    ];

    /**
     *  __get 函数接收一个参数
     * 它将会是你想要访问的属性名
     * 在这个例子中是 $key = "firstName"
     */
    public function __get(string $key)
    {
        return $this->attributes[$key];
    }
}

$normalUser = new NormalUser;

$normalUser->firstName; // 将会返回 'Alice'

舞台裏ではさらに多くのことが起こっています。 Laravel のモデルが __get をどのように正確に使用するかについて詳しく知りたい場合は、以下のソース コードをチェックしてください。

laravel/framework

##__set()<span style="font-size: 16px;"></span>

設定しようとしているプロパティがクラスで宣言されていない場合は、マジック メソッド

_set を使用します。通常のPHPクラスとLaravelのモデルの違いをもう一度見てみましょう。

<?php

class NormalUser
{
    public $firstName = &#39;Bob&#39;;

    protected $attributes = [
        &#39;firstName&#39; => 'Alice',
    ];

    public function __get($key)
    {
        return $this->attributes[$key];
    }
}

$normalUser = new NormalUser;

/**
 * 由于类中存在该属性,将会返回 Bob
 * 所以该例子中没有调用到魔术方法__get
 */
$normalUser->firstName;
<?php

class NormalUser
{
    public $firstName = &#39;Alice&#39;;
}

$normalUser = new NormalUser;

$normalUser->firstName = 'Bob';

$normalUser->firstName; // Will return 'Bob'
ご覧のとおり、この例では、実際にはクラスに存在せず、属性

$attributs# にある Bob の値に影響を与えようとしています。 # #真ん中。魔法の方法を試してみましょう__ set<pre class="brush:php;toolbar:false">&lt;?php namespace App; use Illuminate\Database\Eloquent\Model; class LaravelUser extends Model { protected $attributes = [ &amp;#39;firstName&amp;#39; =&gt; 'Alice',     ]; } $laravelUser = new LaravelUser; $laravelUser-&gt;firstName = 'Bob'; $laravelUser-&gt;firstName; // Will return 'Bob' as well</pre>さあ、始めましょう! Laravel で

__ get

および __ set マジック メソッドの基本的な使用法を正常に実装しました。わずか数行のコードでそれを実行できます。 これらの魔法のメソッドは、あまり詳細には触れずにできるだけシンプルであることに留意してください。これらのメソッドだけではなく、ユースケースだけではないためです。どのように機能するかについて興味がある場合は、お勧めします。あなた自身を探索してみてください! (ご質問がございましたら、お気軽に Twitter までご連絡ください)

もう一度、さらに詳しく知りたい場合は、ここのソース コードにリンクしてください

laravel/framework

最後に最も興味深いことに移りましょう。 ?

<span style="font-size: 16px;">__call()</span> & <span style="font-size: 16px;">__callStatic()</span>

当调用的方法在类中找不到时,__call()会被调用。 在laravel中,该魔术方法方法使宏在 php 中成为可能。

我不会深入讨论宏的所有细节,但如果您感兴趣,这里有一篇很好的文章解释了如何在 Laravel 应用程序中使用它们?

The Magic of Laravel Macros

让我们试着看看如何编写一个简单的宏示例。

<?php

class NormalUser
{
    public $firstName = &#39;Alice&#39;;

    public $lastName = &#39;Bob&#39;;
}

$normalUser = new NormalUser;

$normalUser->fullName(); // 由于没有声明 "fullName" 方法,这将会抛出错误

使用 __call ,可以定义一个包含闭包函数的数组,在我们开发时可以程序化地添加到应用里。

<?php

class NormalUser
{
    public $firstName = &#39;Alice&#39;;

    public $lastName = &#39;Bob&#39;;

    /**
     * 将我们的宏初始化为一个空数组,后面再赋值
     */
    public static $macros = [];

    /**
     * 定义一个添加新宏的方法
     * 第一个参数是我们想要定义的宏的名字
     * 第二个参数是调用宏时将会被执行的闭包函数
     */
    public static function addMacro($name, $macro) {
        static::$macros[$name] = $macro;
    }

    /**
     * "__call" 接收两个参数,
     * $name 是被调用的函数名称,比如 “fullName”
     * $arguments 是传递给函数的所有参数,这里我们使用了一个空数组,因为我们的函数不用传参
     */
    public function __call(string $name, array $arguments) {
        /**
         * 通过名称获取到宏
         */
        $macro = static::$macros[$name];
        /**
         * 然后通过参数执行宏
         * 备注:调用之前,我们需要将闭包绑定到 “$this”,从而使宏方法在同样的上下文中执行
         */
        return call_user_func_array($macro->bindTo($this, static::class), $arguments);
    }
}

$normalUser = new NormalUser;

$normalUser->fullName(); // 这里会中断,因为我们既没有定义 “fullName” 宏,也没有 “fullName” 方法存在。

/**
 * 添加 “fullName” 宏方法
 */
NormalUser::addMacro('fullName', function () {
    return $this->firstName.' '.$this->lastName;
});

$normalUser->fullName(); // 现在,返回 “Alice Bob”

宏要比那个复杂一些,但是我们设法使用 __call 魔术方法来创建一个宏的简单工作版本。

除了对于静态方法, __callStatic__call 是完全一样的。

如果你打算自己再深入研究,这里有宏的特性源代码。

laravel/framework

总结

所以说码农们,当你第一次用 Laravel 会感觉它神奇是对的,但是通过深入查看源代码,你会理解魔法是如何在场景背后施展的。

就像现实生活中的魔法,没有道理的事情是不会发生的,在代码中就更加是了。程序运行的背后总是有着一行代码在执行,只不过需要你去发现它。

英文原文地址:https://dev.to/stvnyung/laravel-greatest-trick-revealed-magic-methods-31om

译文地址:https://learnku.com/laravel/t/40926

【相关推荐:laravel视频教程

以上が魔法のメソッドとは何ですか? Laravelでの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。