Javaで勉強したPHPのオブジェクト指向

Javaのクラスとオブジェクト定義をPHPに翻訳しました。

Javaのできる人は、PHPを勉強するとき、プログラミングの基礎部分とOO(オブジェクト指向)の概念などは熟知したので、
文法だけを覚えればいいと思います。
(C#の方も同じだと思います。みんなOO分かりますね。)
ネットと本でいろいろ見て、やはりPHPとJavaの対照的なものがあまりないので、
自分でメモを残すことにしました。
構文の式ではなくて、一つの例を挙げて、例ですぐに分かるものを目指します。

※:JavaとC#の知識を元にすぐにPHPが使えるようになりたいだけなので、
PHPの特性などに触れません。

まずは

クラスの定義

剣というクラスを作るために
まずはJavaで:

public class Sword{
  //剣の攻撃力
  public int atk;

  //コンストラクタ、攻撃力を代入
  public Sword(int atk){
    this.atk = atk;
  }

  //攻撃メソッド、攻撃力と防御の差を返す
  public int attack(int def){
    return atk-def;
  }
}

ゲーム好きなので、ずいぶん勝手なクラスですが、
PHPに翻訳すると:

class Sword {
  public $atk;

  public function __construct($atk){
    $this->atk = $atk;
  }

  public function attack($def){
    return $this->atk - $def;
  }
}

大体は分かったと思いますが、
PHPについて注意点を羅列します:

  • 変数を定義するとき$を付けるが、呼び出すときは$が要らない。(5行目)
  • コンストラクタメソッドの名前はクラスではなくて、__constructです。(4行目)
  • 引数も返り値もタイプ無し。(PHPは本来もタイプがないですね。)

継承

Javaのコード:
(同じファイルに書き込みことを仮定して親クラスだけがpublicです。)

public class SuperClass{
  protected String superVar;
  //public void printSub(){ System.out.println(subVar); }
  //subVarはSubClassのプロパティなので、上記はエラーになる
}

class SubClass extends SuperClass{
  protected String subVar;
  public void printSuper(){ System.out.println(superVar); }
}

PHPに翻訳すると:

class SuperClass{
  protected $superVar;
  public function printSub(){ echo $this->subVar; }
  //
}

class SubClass extends SuperClass{
  protected $subVar;
  public function printSuper(){ echo $this->superVar; }
}

//テストコード
$obj = new Super();   //親クラスを生成したが
$obj->subVar = 20;    //子クラスのプロパティが使用できる
$obj->printSub();     //"20"を出力

プロパティのアクセス

Javaは全部「.」で済むですが、PHPは二種類です。

//普通の変数とメソッドのプロパティ
// ->
$class->var1;
$class->func();

//キーワード:self, const, static, parent
// ::
Class::staticFunc();
Class::constVar();

アクセス権

Java PHP 注意点
public public / var PHPのvarの効果はpublicと同じ
default (var) PHPのデフォルトはvarアクセス権(すなわちpublic)
protected protected 外部はできないが、親クラスと子クラスからできる
親クラスからもアクセスができる(注意!)
private private JavaとPHPと同じ、親クラスと子クラスからアクセスできない

インターフェイス

interface iPrintable
{
    public function print($var);
}

class Texts implements iPrintable
{
    public $text;

    public function print($var)
    {
        // 実装
        return $result;
    }
}

注意:

  1. インターフェイスを実装するとき、全部のメソッドを実装しなければなりません。
  2. インターフェイスの間でも継承できます。ただし、クラスに実装される場合、全部のインターフェイスのメソッドを実装しなければなりません。
  3. (実はimplements以外extendsでも実装できる)

オブジェクトの比較

よく使うStringの比較↓
Javaなら

str1.equals(str2)

PHPなら

str1 == str2
  • ==:内容の比較(プロパティが等しいか)
  • ===:メモリの比較(同じクラスの同じインスタンスか)

オブジェクトのクローン

Javaの場合:Clonableインターフェイスのclone()を実装

//Java
obj2 = obj1.clone();

PHPの場合

//PHP
class Texts{
    public function __clone() {
        //クローンの実装
    }
}
Texts $obj1 = new Texts();
$obj2 = clone $obj1;

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>