はじめに
最近JavaScriptとPHPを少しだけ勉強し始めて、もちろんどの言語もオブジェクト指向型の書き方があります。
しかし、クラスの書き方が微妙に違っていてなんか混乱してしまいます。
そこでプログラミング言語ごとのクラスの表記を比較してみました。
書いたクラスは統一してHumanクラスで、人間をインスタンス化するクラスです。
プロパティには「名前」と「年齢」を持つようにしました。
メソッドは「introduce」という動作を指定し、自己紹介を表示するメソッドを書きました。
Python
class Human:
def __init__(self, name, age):
self.name = name
self.age = age
print("人間が作られました")
def introduce(self):
print("名前は", self.name,"、", self.age,"歳です")
jack = Human("Jack", 30)
jack.introduce()
特徴としては「self」が登場することです。
他の言語だと「this」に相当するものでしょうか。
オブジェクトそのものを指す意味になります。
プロパティはクラス直下で指定することも出来ますが、上のコードではコンストラクタの中で定義しています。
コンストラクタの定義の部分「__init__」はPython特有みたいなので注意しておきます。
メソッドの引数に「self」を入れることも重要です。
C#
public class Human
{
public string name {get; set;}
public int age {get; set;}
public Human(Name, Age){
this.name = Name;
this.age = Age;
Console.WriteLine("人間が作られました");
}
public void introduce(){
Console.WriteLine("名前は"+this.name+"、"+this.age.ToString()+"歳です")
}
}
var jack = new Human("Jack", 30);
jack.introduce();
特徴としてはプロパティの定義の部分の「 {get; set;} 」ではないでしょうか。
ここをいじることで読み取り専用などの指定をすることが出来ます。
プロパティを指定しないことが可能なのか(コンストラクタの中で書けば十分)は分かりませんが、プロパティの定義が他の言語より面倒でした。
JavaScript
class Human {
constructor(name, age){
this.name = name;
this.age = age;
console.log("人間が作られました");
}
introduce(){
console.log(`名前は${this.name}、${this.age}歳です`);
}
}
let jack = new Human("Jack", 30);
jack.introduce();
JavaScriptはネットで検索したところ、クラスの直下でプロパティの定義が出来ないみたいです。
なのでコンストラクタの中でプロパティの定義をしました。
PHP
<?php
class Human {
public $name;
public $age;
public function __construct($name, $age){
$this->name = $name;
$this->age = $age;
echo "人間が作られました";
}
public function introduce(){
echo "名前は{$this->name}、{$this->age}歳です";
}
}
$jack = new Human("Jack", 30);
$jack->introduce();
?>
PHPの特徴は変数の定義に 「$」を付けることだと思います。
Pythonに書きなれているとかなり面倒に感じます。
PHPはJavaScriptと違い、クラスの直下でプロパティの定義をすることが出来ます。(と言うか必ず必要なのでしょうか?)
また、クラスのプロパティを呼ぶときに他の言語は「.(ドット)」で繋げればいいところを「->」で繋げる必要があります。
注意するべきところは、プロパティの宣言では「$name」なのに、プロパティを呼び出すときは「$this->name」となり、$はnameの頭に書かないということです。
コンストラクタの定義で「__construct」というように__(アンダーバー2本)を忘れないことも注意です。
追記(getterとsetterの表記の違い)
クラスのプロパティには変更などを制限するためにgetterとsetterがありますが、その表記の違いをまとめます。
クラスは商品クラスでプロパティは値段にします。
C#
public class Goods
{
public int price {get; set;}
//以下省略
}
「{get; set;}」でgetterとsetterを設定しています。
publicであることにも注目です。
ここの記述はもっと詳しく書けるので調べてみてください。
PHP
<?php
class Goods {
private $price;
public function Getter(){
return $this->price;
}
public function Setter($price){
$this->price = $price
}
//以下省略
}
?>
PHPではgetterとsetterを自分で定義しなければいけません。
また「$price」を「private」にして、関数を定義することで、アクセスを制限できるようになっています。
C#とPHPでのgetterとsetterの書き方の違いをまとめました。
最後に
暇なのでいろんな言語を勉強し始めましたが、Pythonがやっぱり楽です。
他の言語で大量に出てくる「{}(中かっこ)」がないだけでとてもすっきりするし、見た目が美しいです。
今回はプログラミング言語ごとのクラスの宣言と呼び出しの表記を比較しました。
今後勉強した言語が増えたらさらに比較をしてみたいと思います。
コメント