PHP
PHP7.2

なんとなく使っていたPHPのclassについて改めて整理してみる part1

自己紹介

みなさんこんばんは。tyamahoriです。
メインはPHPを使って開発をしています。

今回やること

普段使っているPHP,その中でなんとなく理解したつもりでいたクラスの挙動について改めてまとめてみました。dockerでPHP7.2の環境を構築して、確認をしています。

クラスのインスタンスについて

まずは簡単なclassを定義して、中にプロパティを宣言しました。

sample.php
<?php
class Profile
{
    public $name;
    public $birth_date;
    public $blood_type;
    public $company;
}

定義したclassをインスタンス化します。

sample.php
<?php
class Profile
{
    public $name;
    public $birth_date;
    public $blood_type;
    public $company;
}

$tyamahori = new Profile();

$tyamahorivar_dump()でどうなっているか確認してみます。

sample.php
<?php
class Profile
{
    public $name;
    public $birth_date;
    public $blood_type;
    public $company;
}

$tyamahori = new Profile();

var_dump($tyamahori);

結果はこうでした。

object(Profile)#1 (4) {
  ["name"]=>
  NULL
  ["birth_date"]=>
  NULL
  ["blood_type"]=>
  NULL
  ["company"]=>
  NULL
}

プロパティの中身を定義していないのでNULLとなっています。
次に定義をしてみます。

sample.php
<?php
class Profile
{
    public $name;
    public $birth_date;
    public $blood_type;
    public $company;
}

$tyamahori = new Profile();

$tyamahori->name = 'Kazuki Tamahori';
$tyamahori->birth_date = '1989-09-24';
$tyamahori->blood_type = 'O';
$tyamahori->company = 'Impressive';

再度var_dump()で確認してみます。

sample.php
<?php
class Profile
{
    public $name;
    public $birth_date;
    public $blood_type;
    public $company;
}

$tyamahori = new Profile();

$tyamahori->name = 'Kazuki Tamahori';
$tyamahori->birth_date = '1989-09-24';
$tyamahori->blood_type = 'O';
$tyamahori->company = 'Impressive';

var_dump($tyamahori);

結果はこうなりました。

object(Profile)#1 (4) {
  ["name"]=>
  string(15) "Kazuki Tamahori"
  ["birth_date"]=>
  string(10) "1989-09-24"
  ["blood_type"]=>
  string(1) "O"
  ["company"]=>
  string(10) "Impressive"
}

更にくどいようですがvar_dump()で確認してみます。

sample.php
<?php
class Profile
{
    public $name;
    public $birth_date;
    public $blood_type;
    public $company;
}

$tyamahori = new Profile();

$tyamahori->name = 'Kazuki Tamahori';
$tyamahori->birth_date = '1989-09-24';
$tyamahori->blood_type = 'O';
$tyamahori->company = 'Impressive';

var_dump($tyamahori->name, $tyamahori->birth_date, $tyamahori->blood_type, $tyamahori->company);

結果はこうなりました。

string(15) "Kazuki Tamahori"
string(10) "1989-09-24"
string(1) "O"
string(10) "Impressive"

ありがちな間違いとして、次のようにして、var_dump()してみます

sample.php
<?php
class Profile
{
    public $name;
    public $birth_date;
    public $blood_type;
    public $company;
}

$tyamahori = new Profile();

$tyamahori->name = 'Kazuki Tamahori';
$tyamahori->birth_date = '1989-09-24';
$tyamahori->blood_type = 'O';
$tyamahori->company = 'Impressive';

// わざと$をつけています。
var_dump($tyamahori->$name, $tyamahori->$birth_date, $tyamahori->$blood_type, $tyamahori->$company);

結果・・・

NULL
NULL
NULL
NULL

なんとNULLになるのですね。エラーになるとばっかり思ってました。確認してみるもんですね。

最後にclassに宣言していないプロパティを設定したどうなるか確認してみます。

sample.php
<?php
class Profile
{
    public $name;
    public $birth_date;
    public $blood_type;
    public $company;
}

$tyamahori = new Profile();
var_dump($tyamahori);

$tyamahori->name = 'Kazuki Tamahori';
$tyamahori->birth_date = '1989-09-24';
$tyamahori->blood_type = 'O';
$tyamahori->company = 'Impressive';
$tyamahori->sex = 'male';// 宣言していないプロパティ $sexをここで追加

var_dump($tyamahori);

結果・・・・

object(Profile)#1 (4) {
  ["name"]=>
  NULL
  ["birth_date"]=>
  NULL
  ["blood_type"]=>
  NULL
  ["company"]=>
  NULL
}
object(Profile)#1 (5) {
  ["name"]=>
  string(15) "Kazuki Tamahori"
  ["birth_date"]=>
  string(10) "1989-09-24"
  ["blood_type"]=>
  string(1) "O"
  ["company"]=>
  string(10) "Impressive"
  ["sex"]=>
  string(4) "male"
}

エラーは出ずに、 プロパティの$sexが定義できております。ただ実際のコードでこんなことされてしまうと普通にテンパりそうです。使うプロパティは必ずclass定義時に宣言して後から追加はしないほうが良いですね。

まとめ

Qiitaに記事をまとめてアウトプットするって良いですね!理解が進みます