Help us understand the problem. What is going on with this article?

PHPのクラスとオブジェクト

More than 3 years have passed since last update.

「関数型」言語というものもあるが、phpは「オブジェクト指向型」。
統計などには「関数型」、データを取り出して表示するようなものでは「オブジェクト指向型」が強いらしい。

オブジェクト指向型

インスタンスを作っていくやつ。
PersonクラスのインスタンスとしてBobとかMaryができる。

クラスをつくる

<?php

namespace App;

class TaskService {

    //プロパティ
    public $hoge;

    //メソッド
    public function hoge(){
    }

}

クラスを利用する

phpでプロパティ、メソッドの呼び出しは -> を使う。

Route::get('/', function(){
    $hhoge = new TaskService();

    $hoge->hoge;
    $hoge->hoge();

    return "hogehoge";
});

デフォルト値付き

<?php

namespace App;

class TaskService {

    public $hoge;

    public function hoge($arg1, $arg2=null){
    }

}

ただしデフォルト値を割り当てる場合は、後ろ側に置くこと。

protected、public、private / static

protected

クラス内もしくは継承クラスでのみ呼び出し可能。

public

他の場所からも -> で呼び出せる。

private

クラス内でのみ呼び出し可能。

staticはちょっと別ジャンル

  • new Person
  • Person::

どちらで呼び出すのかを決める。

型をつける

<?php

namespace App;

class TaskService {

    public $hoge;

    public function hoge(bool $arg1,array $arg2=null): array
    {
    }

}

返ってくる型 :array はリターンタイプヒンティングという。
返り値がない場合は :void が使える。

クラスの役割

  • 処理
  • データ

のどちらを行うクラスなのかははっきりさせておきましょう。

データを取り扱うクラス:Entity

配列だったデータを

<?php


namespace App;

class TaskInfo
{
    public $name;
    public $important;

とすることで、 ->name のように取得できるようになる。

<?php

namespace App;

class TaskService {

    public $hoge;

    public function hoge(TaskInfo $arg1,array $arg2=null): array
    {
        $name = $arg1->name;
    }

}

コンストラクタ

<?php


namespace App;
use App\TaskInfo;

class TaskService
{
    public $name;
    public $important;

    public function __construct(
        TaskInfo $task
    ){
        $this->task = $task;
    }

foreach

    $props = ["name", "title"];

    foreach($props as $propName){
        $this->{$propName};
    }
    $methodName = "piyo";

    $this->$methodName();

クラスの継承

extends を使う。
何も書かなければ親のメソッドと同じメソッドを作った場合、親の内容は実行されない。
以下のように parent で呼び出した場合は、親のメソッドに追加でいろいろ記述できるような感じになる。

<?php


namespace App;

class TaskInfo extends Model
{

    public function save(array $options = []){
        parent::save($options);
        //do something...
        return [];
    }
}

PHPのオーバーロード

PHPのオーバーロードは一般的なものとは全然違う、らしい。

オブジェクトが文字列として扱える

public function __toString(){
    return "this is task Service";
}

関数として

public function __invoke(){
    return "hogehoge";
}

そのほかにも

  • __get
  • __call
shosho
Qiitaには忘れそうなこと、勉強したことをメモしてます。
https://shosho-egg.hateblo.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away