はじめに
この記事はTwitterで人気のハッシュタグ#100DaysOfCode
をつけて、
100日間プログラミング学習を続けるチャレンジに挑戦した22日目の記録です。
動作環境
- PHP 7.1.16 (cli)
- Ruby 2.4.1p111 (2017-03-22 revision 58053)
本日学んだこと
- Progate_PHP学習コース2でRubyと比較しながらオブジェクト指向について復習
- インスタンスについて
- プロパティとインスタンス変数
- メソッドについて
インスタンスについて
インスタンスは、クラスを実体化したもの。クラスは抽象的で、インスタンスは具体的。
例えば、動物というのは概念だけど、ペンギンは動物という概念に属する具体的な種類を指しています。
※2018/07/11追記
打ち消し線の部分は抽象度の話で、クラスとインスタンスの話とは別物というご指摘をいただきました。
ペンギン自体もクラスに属していて、具体的な身長や体重、名前などが付けられて、初めてインスタンス化されることになるということです!
クラスを実体化することを、プログラミング用語でインスタンス化と呼んでいます。
PHPでのインスタンス作成方法
<?php
class Animal {
}
$penguin = new Animal(); //ペンギンインスタンスの生成
?>
Rubyでのインスタンス作成方法
class Animal
end
penguin = Animal.new # ペンギンインスタンスの生成
プロパティとインスタンス変数
オブジェクト指向において、クラスがあらかじめ持っている情報がある。
PHPではその情報のことをプロパティ、Rubyではインスタンス変数として管理している。
インスタンス化する時はプロパティやインスタンス変数を使うことで、より具体性を持たせることができる。
<?php
class Animal {
public $kind;
}
$penguin = new Animal(); //Animalクラスからペンギンインスタンスを生成
$penguin->kind = 'ペンギン'; # プロパティnameにペンギンという文字列を代入
echo $penguin->kind; //=> 'ペンギン'
?>
class Animal
attr_accessor :kind
end
penguin = Animal.new # Animalクラスからペンギンインスタンスを生成
penguin.kind = 'ペンギン'; # インスタンス変数nameにペンギンという文字列を代入
puts penguin.kind #=>'ペンギン'
メソッドについて
メソッドとは、インスタンスが持っている固有の関数のこと。クラスの中で定義することができる。
<?php
class Animal {
public function walk() {
echo 'てくてく歩く';
}
}
$penguin = new Animal();
$penguin->walk(); //=>メソッドの呼び出し。「てくてく歩く」が出力される。
?>
class Animal
def walk
puts 'てくてく歩く'
end
end
penguin = Animal.new
penguin.wakk #=>メソッドの呼び出し。「てくてく歩く」が出力される。
クラスが持つ情報(プロパティやインスタンス変数)をメソッドの中で使うには、PHPでは$this
、Rubyではself
を使うことで参照可能。
<?php
class Animal {
public $kind;
public function walk() {
echo $this->kind.'はてくてく歩く';
}
}
$penguin = new Animal();
$penguin->kind = 'ペンギン';
$penguin->walk(); //=>「ペンギンはてくてく歩く」が出力される。
?>
class Animal
attr_accessor :kind
def walk
puts "#{self.kind}はてくてく歩く"
end
end
penguin = Animal.new
penguin.kind = 'ペンギン'
penguin.walk #=>「ペンギンはてくてく歩く」が出力される。
クラスからインスタンスを生成する際に、自動で呼び出されるメソッドをコンストラクタと呼ぶ。
PHPでは__construct()
、Rubyではinitialize
を使って定義する。
<?php
class Animal {
public function __construct() {
echo '新しい動物が誕生しました';
}
}
$penguin = new Animal(); //=>「新しい動物が誕生しました」が出力される。
?>
class Animal
def initialize
puts "新しい動物が誕生しました"
end
end
penguin = Animal.new #=>「新しい動物が誕生しました」が出力される。
なお、コンストラクタ内でクラスの持つ情報を持たせることも可能。PHPではプロパティを$this
で、Rubyではインスタンス変数をself
で渡せばいい。
この性質を応用して、コンストラクタの引数にプロパティやインスタンス変数を与えれば、クラスからインスタンスを生成する際に任意の引数に応じて出力結果を変化させることができる。
<?php
class Animal {
public $kind
public function __construct($name) {
$this.kind = $this;
echo '新しい動物'.$this->kind.'が誕生しました';
}
}
$penguin = new Animal('ペンギン'); //=>「新しい動物ペンギンが誕生しました」が出力される。
?>
class Animal
attr_accessor :kind
def initialize(kind)
self.name = kind
puts "新しい動物#{self.kind}が誕生しました"
end
end
penguin = Animal.new('ペンギン') #=>「新しい動物ペンギンが誕生しました」が出力される。