PHPとRubyを比較してオブジェクト指向について理解する_100DaysOfCodeチャレンジ22日目(Day_22:#100DaysOfCode)

# はじめに

この記事は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
<?php 
  class Animal {
  }
  $penguin = new Animal(); //ペンギンインスタンスの生成
?>
```

### Rubyでのインスタンス作成方法

```ruby
class Animal
end

penguin = Animal.new # ペンギンインスタンスの生成
```

## プロパティとインスタンス変数

オブジェクト指向において、クラスがあらかじめ持っている情報がある。

PHPではその情報のことをプロパティ、Rubyではインスタンス変数として管理している。

インスタンス化する時はプロパティやインスタンス変数を使うことで、より具体性を持たせることができる。

```php
<?php 
  class Animal {
  public $kind;
  }
  $penguin = new Animal();  //Animalクラスからペンギンインスタンスを生成
  $penguin->kind = 'ペンギン'; # プロパティnameにペンギンという文字列を代入
  echo $penguin->kind; //=> 'ペンギン'
?>
```

```ruby
class Animal
  attr_accessor :kind
end

penguin = Animal.new # Animalクラスからペンギンインスタンスを生成
penguin.kind = 'ペンギン'; # インスタンス変数nameにペンギンという文字列を代入
puts penguin.kind #=>'ペンギン'
```

## メソッドについて

メソッドとは、インスタンスが持っている固有の関数のこと。クラスの中で定義することができる。

```php
<?php 
  class Animal {
  public function walk() {
    echo 'てくてく歩く';
    }
  }
  $penguin = new Animal();
  $penguin->walk(); //=>メソッドの呼び出し。「てくてく歩く」が出力される。 
?>
```

```ruby
class Animal
  def walk
    puts 'てくてく歩く'
  end 
end

penguin = Animal.new
penguin.wakk #=>メソッドの呼び出し。「てくてく歩く」が出力される。 
```

クラスが持つ情報(プロパティやインスタンス変数)をメソッドの中で使うには、PHPでは`$this`、Rubyでは`self`を使うことで参照可能。

```php
<?php 
  class Animal {
  public $kind;
  public function walk() {
    echo $this->kind.'はてくてく歩く';
    }
  }
  $penguin = new Animal();
  $penguin->kind = 'ペンギン';
  $penguin->walk(); //=>「ペンギンはてくてく歩く」が出力される。 
?>
```

```ruby
class Animal
  attr_accessor :kind
  def walk
    puts "#{self.kind}はてくてく歩く"
  end 
end

penguin = Animal.new
penguin.kind = 'ペンギン'
penguin.walk #=>「ペンギンはてくてく歩く」が出力される。 
```

クラスからインスタンスを生成する際に、自動で呼び出されるメソッドをコンストラクタと呼ぶ。

PHPでは`__construct()`、Rubyでは`initialize`を使って定義する。

```php
<?php 
  class Animal {
  public function __construct() {
    echo '新しい動物が誕生しました';
    }
  }
  $penguin = new Animal();  //=>「新しい動物が誕生しました」が出力される。 
?>
```

```ruby
class Animal
  def initialize
    puts "新しい動物が誕生しました"
  end 
end

penguin = Animal.new #=>「新しい動物が誕生しました」が出力される。 
```

なお、コンストラクタ内でクラスの持つ情報を持たせることも可能。PHPではプロパティを`$this`で、Rubyではインスタンス変数を`self`で渡せばいい。

この性質を応用して、コンストラクタの引数にプロパティやインスタンス変数を与えれば、クラスからインスタンスを生成する際に任意の引数に応じて出力結果を変化させることができる。

```php
<?php 
  class Animal {
  public $kind
  public function __construct($name) {
    $this.kind = $this;
    echo '新しい動物'.$this->kind.'が誕生しました';
    }
  }
  $penguin = new Animal('ペンギン');  //=>「新しい動物ペンギンが誕生しました」が出力される。 
?>
```

```ruby
class Animal
  attr_accessor :kind
  def initialize(kind)
    self.name = kind
    puts "新しい動物#{self.kind}が誕生しました"
  end 
end

penguin = Animal.new('ペンギン') #=>「新しい動物ペンギンが誕生しました」が出力される。 
```

<iframe src="https://paiza.io/projects/e/VZ8ECbTA95GEuF-r4y4-6g?theme=twilight" width="100%" height="500" scrolling="no" seamless="seamless"></iframe>