PHPのアロー演算子の使い方や特徴について

採用はこちら

PHPで一般に「アロー演算子」と呼ばれる -> は、オブジェクトのプロパティやメソッドへアクセスするために使用する演算子です。

PHPの公式ドキュメントでは、-> は「Object Operator(オブジェクト演算子)」として扱われています。

PHPでクラスやオブジェクトを扱う場合は頻繁に登場するため、オブジェクト指向プログラミングを学ぶうえで基本となる構文のひとつです。

基本的には、次のように記述します。

$object->property;
$object->method();

プロパティへアクセスする場合は $object->property、メソッドを呼び出す場合は $object->method() と記述します。

目次

PHPのアロー演算子でプロパティにアクセスする方法

プロパティの値を取得する

-> を使うと、オブジェクトが持つ非staticプロパティへアクセスできます。

たとえば、次のようなクラスがあるとします。

class User
{
    public string $name = 'Tanaka';
}

$user = new User();

echo $user->name;

実行結果は次のとおりです。

Tanaka

$userUser クラスから生成されたオブジェクトで、name はそのオブジェクトが持つプロパティです。

$user->name

と記述することで、name プロパティの値を取得できます。

プロパティの値を変更する

-> は、プロパティの値を取得するだけでなく、値を代入する場合にも使用できます。

class User
{
    public string $name = 'Tanaka';
}

$user = new User();

$user->name = 'Suzuki';

echo $user->name;

実行結果は次のとおりです。

Suzuki

このように、次の形式でプロパティへ値を代入できます。

$object->property = 値;

ただし、外部から直接アクセスできるかどうかは、publicprotectedprivate などの可視性によって異なります。

PHPのアロー演算子でメソッドを呼び出す方法

基本的なメソッド呼び出し

オブジェクトに定義された非staticメソッドを呼び出す場合にも -> を使用します。

class User
{
    public string $name = 'Tanaka';

    public function greet(): string
    {
        return 'こんにちは、' . $this->name . 'さん';
    }
}

$user = new User();

echo $user->greet();

実行結果は次のようになります。

こんにちは、Tanakaさん

メソッドを呼び出す場合は、次のようにメソッド名の後ろへ () を付けます。

$object->method();

プロパティへのアクセスとメソッド呼び出しの違いを整理すると、次のようになります。

$object->property;
$object->method();

() が付いているものがメソッド呼び出しです。

$this->の意味と使い方

$thisは現在のオブジェクトを表す

PHPのクラス内部では、$this-> という書き方が頻繁に登場します。

$this は、現在処理しているオブジェクト自身を表します。

たとえば、次のコードを見てみましょう。

class User
{
    private string $name = '';

    public function setName(string $name): void
    {
        $this->name = $name;
    }

    public function getName(): string
    {
        return $this->name;
    }
}

このコードでは、

$this->name

によって、現在のオブジェクトが持つ name プロパティへアクセスしています。

実際に使用すると、次のようになります。

$user = new User();

$user->setName('Tanaka');

echo $user->getName();

実行結果は次のとおりです。

Tanaka

staticメソッドでは$thisを使用できない

$this は特定のインスタンスを表すため、staticメソッド内では使用できません。

たとえば、次のような使い方はできません。

class User
{
    public static function test(): void
    {
        // $this は使用できない
    }
}

staticメソッドやstaticプロパティを扱う場合は、:: を使用するケースが一般的です。

アロー演算子とスコープ定義演算子::の違い

->はインスタンスのメンバーに使用する

-> は、主にインスタンス化したオブジェクトの非staticプロパティや非staticメソッドへアクセスする場合に使用します。

$user = new User();

echo $user->name;
$user->getName();

このように、new などで生成したオブジェクトを通してメンバーへアクセスします。

::はstaticメンバーやクラス定数などに使用する

一方、:: は「スコープ定義演算子」と呼ばれ、staticプロパティ、staticメソッド、クラス定数などへアクセスする場合に使用します。

class User
{
    public const TYPE = 'member';

    public static string $status = 'active';

    public static function create(): void
    {
        echo 'ユーザーを作成します';
    }
}

echo User::TYPE;
echo User::$status;

User::create();

また、クラス内部では次のような書き方もあります。

self::method();
parent::method();
static::method();

したがって、単純に「:: はクラスそのものに使う」と覚えるよりも、クラスのスコープに属するメンバーなどへアクセスする演算子と理解すると正確です。

->::の違いを整理する

主な違いは次のとおりです。

記述主な用途
$object->propertyインスタンスのプロパティへアクセス
$object->method()インスタンスメソッドを呼び出す
ClassName::$propertystaticプロパティへアクセス
ClassName::method()staticメソッドを呼び出す
ClassName::CONSTANTクラス定数へアクセス

PHPのクラスを扱う場合は、->:: を適切に使い分けることが重要です。

PHPのNull安全演算子?->とは

nullの可能性がある場合に使用する

PHP 8.0以降では、通常の -> に似たNull安全演算子 ?-> を使用できます。

たとえば、次のコードを考えてみましょう。

$city = $user->getAddress()->getCity();

もし getAddress()null を返した場合、その後に ->getCity() を呼び出すことはできません。

そこで利用できるのが ?-> です。

$city = $user->getAddress()?->getCity();

getAddress() の戻り値が null だった場合、それ以降の呼び出しは行われず、結果も null になります。

Null安全演算子は連続して使用できる

複数のメソッドを連続して呼び出す場合にも利用できます。

$country = $user
    ?->getAddress()
    ?->getCity()
    ?->getCountry();

途中で null になった場合、それ以降のNull安全チェーンは評価されません。

?->を代入先には使用できない

Null安全演算子は、値を安全に取得したりメソッドを呼び出したりする用途で使用します。

次のように代入先として使用することはできません。

$user?->name = 'Tanaka';

通常のプロパティへ値を代入する場合は、-> を使用します。

$user->name = 'Tanaka';

アロー演算子でメソッドチェーンを記述する方法

メソッドがオブジェクトを返す場合は連続して呼び出せる

PHPでは、メソッドの戻り値がオブジェクトになっている場合、-> を連続して記述できます。

このような書き方をメソッドチェーンと呼びます。

$object
    ->methodA()
    ->methodB()
    ->methodC();

たとえば、次のように記述できます。

class User
{
    private string $name = '';
    private int $age = 0;

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function setAge(int $age): self
    {
        $this->age = $age;

        return $this;
    }

    public function show(): string
    {
        return $this->name . ':' . $this->age . '歳';
    }
}

$user = new User();

echo $user
    ->setName('Tanaka')
    ->setAge(30)
    ->show();

ここで重要なのは、-> 自体がメソッドチェーンを実現しているわけではない点です。

setName()setAge() が、

return $this;

によってオブジェクトを返しているため、戻り値に対してさらに -> を使えます。

LaravelなどのPHPフレームワークでも、メソッドチェーンは頻繁に利用されています。

配列とオブジェクトではアクセス方法が異なる

配列は[]でアクセスする

PHPでは、配列とオブジェクトでデータへのアクセス方法が異なります。

配列の場合は、次のように記述します。

$user = [
    'name' => 'Tanaka',
];

echo $user['name'];

配列のキーへアクセスするときは [] を使用します。

オブジェクトは->でアクセスする

オブジェクトの場合は、次のように記述します。

$user = new User();

echo $user->name;

つまり、基本的には次のように区別します。

$array['key'];
$object->property;

APIやJSONを扱う処理では、配列とオブジェクトを混同するとエラーにつながることがあります。

変数に格納されているデータ型を確認し、適切なアクセス方法を使用することが大切です。

publicprotectedprivateによる違い

publicプロパティには外部からアクセスできる

public に設定されたプロパティやメソッドは、基本的にクラスの外部からアクセスできます。

class User
{
    public string $name = 'Tanaka';
}

$user = new User();

echo $user->name;

このコードでは、namepublic のため直接アクセスできます。

privateプロパティには外部から直接アクセスできない

一方、private のプロパティへクラス外部から直接アクセスすることはできません。

class User
{
    private string $name = 'Tanaka';
}

$user = new User();

// 外部から直接アクセスできない
echo $user->name;

値を取得したい場合は、publicメソッドを用意する方法があります。

class User
{
    private string $name = 'Tanaka';

    public function getName(): string
    {
        return $this->name;
    }
}

$user = new User();

echo $user->getName();

protectedは継承関係などで利用できる

protected に設定されたメンバーは、クラス自身や継承関係にあるクラスなどからアクセスできます。

おおまかな違いを整理すると、次のとおりです。

可視性主なアクセス範囲
public基本的にどこからでもアクセス可能
protectedクラス自身や継承関係にあるクラスなど
private定義したクラス内部

アロー演算子を使用していても、可視性の制限を無視してアクセスできるわけではありません。

プロパティ名やメソッド名を変数で指定する方法

プロパティ名を変数で指定できる

PHPでは、変数に格納された文字列をプロパティ名として使用することもできます。

class User
{
    public string $name = 'Tanaka';
}

$user = new User();

$property = 'name';

echo $user->$property;

このコードは、実質的に次のコードと同じプロパティへアクセスしています。

echo $user->name;

メソッド名も変数で指定できる

メソッド名についても、変数で指定できます。

class User
{
    public function greet(): string
    {
        return 'Hello';
    }
}

$user = new User();

$method = 'greet';

echo $user->$method();

ただし、こうした動的な呼び出しを多用すると、コードを読みづらくしたり静的解析を難しくしたりする場合があります。

必要な場面に限定して使うとよいでしょう。

「動的プロパティ」とは意味が異なる

プロパティ名を変数で指定することと、PHPでいう「動的プロパティ」は別の概念です。

たとえば、宣言されていないプロパティを実行時に作成する次のような記述は、「動的プロパティ」と呼ばれることがあります。

$user->unknownProperty = 'value';

そのため、

$property = 'name';
$user->$property;

のような可変的なプロパティアクセスとは区別して理解することが重要です。

->=>の違い

->はオブジェクトへアクセスする演算子

-> は、オブジェクトのプロパティやメソッドへアクセスするときに使用します。

$user->name;
$user->getName();

=>は配列などで使用する

=> は、-> とはまったく異なる記号です。

たとえば、連想配列ではキーと値を関連付けるために使用します。

$user = [
    'name' => 'Tanaka',
    'age' => 30,
];

また、foreach でも使用できます。

foreach ($users as $id => $name) {
    echo $id;
    echo $name;
}

->=> は形が似ていますが、役割は異なります。

PHPのアロー関数fn() =>との違い

アロー関数はPHP 7.4以降で使用できる

PHPには、-> とは別に「アロー関数」と呼ばれる機能があります。

アロー関数はPHP 7.4以降で使用でき、短い無名関数を簡潔に記述できます。

$double = fn($number) => $number * 2;

echo $double(10);

実行結果は次のとおりです。

20

アロー関数では => を使用します。

オブジェクトへのアクセスで使用する -> とは別の構文です。

外側の変数を自動的に参照できる

アロー関数には、外側のスコープにある変数を値として自動的に取り込める特徴があります。

$rate = 1.1;

$calculate = fn($price) => $price * $rate;

echo $calculate(1000);

通常の無名関数で見られる use ($rate) を明示しなくても、外側にある $rate を参照できます。

「アロー演算子」と「アロー関数」は名前が似ていますが、別の機能なので注意しましょう。

PHPのアロー演算子を使う際の注意点

nullに対して通常の->を使用しない

変数が null の状態でメソッドを呼び出すと、正常に処理できません。

$user = null;

$user->getName();

null の可能性がある場合は、PHP 8.0以降であればNull安全演算子 ?-> を検討できます。

$name = $user?->getName();

配列とオブジェクトを取り違えない

次のように配列へ -> を使用することはできません。

$user = [
    'name' => 'Tanaka',
];

echo $user->name;

配列の場合は次のようにします。

echo $user['name'];

オブジェクトなら、次のように -> を使用します。

echo $user->name;

staticメンバーとの違いを理解する

インスタンスメソッドなら、基本的に次のように呼び出します。

$user->getName();

staticメソッドなら、次のように :: を使用します。

User::create();

->:: の違いを理解しておくと、PHPのクラスを扱う際の混乱を減らせます。

PHPに登場する矢印に似た演算子や記号

->はオブジェクト演算子

$user->name;
$user->getName();

オブジェクトのプロパティやメソッドへアクセスするために使用します。

?->はNull安全演算子

$user?->getName();

null の可能性がある値へ安全にアクセスするために使用します。

=>は配列やアロー関数などで使用する

$data = [
    'name' => 'Tanaka',
];

$double = fn($number) => $number * 2;

-> とは用途が異なります。

<=>は宇宙船演算子

PHPには <=> という比較演算子もあります。

$result = $a <=> $b;

左辺と右辺を比較し、大小関係に応じて負の整数、0、正の整数を返します。

|>はパイプ演算子

PHP 8.5では、パイプ演算子 |> が追加されています。

値を左から右へ関数へ渡して処理をつなげるための演算子で、オブジェクト演算子 -> とは異なる機能です。

そのため、PHPで矢印のような記号を見かけた場合は、それぞれの役割を区別して理解する必要があります。

PHPのアロー演算子について理解しておきたいポイント

PHPで一般にアロー演算子と呼ばれる -> は、オブジェクトの非staticプロパティや非staticメソッドへアクセスするために使用する基本的な演算子です。

たとえば、プロパティへアクセスする場合は、

$user->name;

メソッドを呼び出す場合は、

$user->getName();

と記述します。

クラス内部では、現在のオブジェクトを表す $this と組み合わせて、

$this->name;
$this->getName();

のように使用します。

また、staticメンバーなどへアクセスするときに使用する :: や、PHP 8.0以降で利用できるNull安全演算子 ?-> との違いも理解しておくことが重要です。

PHPには =><=>|> など矢印に似た記号も存在しますが、それぞれ役割は異なります。

まずは、「-> はオブジェクトのプロパティやメソッドへアクセスするための演算子」と覚えておくと、PHPのクラスやオブジェクト指向プログラミングを理解しやすくなるでしょう。

以上、PHPのアロー演算子の使い方や特徴についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次