LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-10

自己紹介

みなさんこんばんは。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に記事をまとめてアウトプットするって良いですね!理解が進みます

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1