ねっとぱんだ-プログラミング勉強ブログ-

Webデザイン、プログラミングの勉強ブログ。

【php】オブジェクト、クラス、インスタンス


参考 : http://qiita.com/mpyw/items/41230bec5c02142ae691

オブジェクト、クラス、インスタンス

引用
http://wa3.i-3-i.info/word13563.html

オブジェクト
クラスとインスタンスを指す?
クラス
「型」、「設計図」
属性(プロパティ)と操作(メソッド)を定義したもの
インスタンス
「実体」
実際にメモリ上に配置されたデータの集合という意味合いが強く
「クラスをnewしたもの」

クラスの作り方

class User { }

new演算子で生成

$a = new User;
class User{
    //プロパティ
    public $name;
    //コンストラクタ
    public function __construct($name){
        $this->name = $name;
    }
    //メソッド
    public function sayHi() {
    echo "hi, i am $this->name!";
    }
}

$taro = new User("Taro");

//インスタンスのnameプロパティを参照
echo $taro->name;
//改行
echo nl2br("\n");
//sayHiメソッドを参照
$taro->sayHi();

引用
http://php.net/manual/ja/language.oop5.properties.php
http://www.atmarkit.co.jp/ait/articles/1506/03/news019.html

プロパティ
クラスのメンバ変数のことをプロパティと呼ぶ
メンバ変数
オブジェクト指向における「属性」を定義したもの。
クラスの中にある変数
コンストラクタ
クラスからインスタンスを生成する際(new を行う際)に最初に実行される関数
new をするだけで自動的に実行される
__constructという名前のメソッドを使う
メソッド
クラス定義内に書かれている関数

クラスの継承

extends
指定したクラスを継承する
<?php
class User{
    //プロパティ
    public $name;
    //コンストラクタ
    public function __construct($name){
        $this->name = $name;
    }
    //メソッド
    public function sayHi() {
    echo "hi, i am $this->name!";
    }
}
class AdminUser extends User{
    public function sayHello(){
        echo "Hello Admin";
    }
}
$bob = new AdminUser("bob");
echo $bob->sayHello;
echo nl2br("\n");
//継承されたクラス内のプロパテ
echo $bob->name;

子クラスで親クラスをover ride(上書き)できる。

<?php
//親クラス
class User{
    //プロパティ
    public $name;
    //コンストラクタ
    public function __construct($name){
        $this->name = $name;
    }
    //メソッド
    public function sayHi() {
    echo "hi, i am $this->name!";
    }
}
//子クラス
class AdminUser extends User{
    //メソッド
    public function sayHello(){
        echo "Hello Admin";
    }
    public function sayHi() {
    echo "hi, i am $this->name!";
    }
}
$bob = new AdminUser("bob");
//上書きされたメソッド
echo $bob->sayHi();

上書きしたくない場合はアクセス権(public等)の前にfinalとつける。
override出来ないので「Fatal error: Cannot override final method User::sayHoo()」というメッセージがでて実行されない。

<?php
class User{
    //プロパティ
    public $name;
    //コンストラクタ
    public function __construct($name){
        $this->name = $name;
    }
    //メソッド
    final public function sayHoo(){
    echo "hoo";
    }
}
//子クラス
class AdminUser extends User{
    //上書き出来ない
    public function sayHoo(){
    echo "hoo";
    }
}
$bob = new User("Tom");
$Tom = new AdminUser("Tom");
//上書きできないメソッド
echo $Tom->sayHoo();

アクセス権

private
そのクラス内のみアクセス可能
protected
そのクラス内+親クラス内からのみアクセス可能
同じクラス内、同じパッケージ、サブクラスからアクセス可能(http://www.gamesite8.com/archives/588322.html)
public
どこからでもアクセス可能

privateを使う

class User{
    //プロパティ
    private $name;
    //コンストラクタ
    public function __construct($name){
        $this->name = $name;
    }
    }
class AdminUser extends User {
    public function sayHello(){
        echo 'hello from Admin $this->name';
    }
}

$bob = new AdminUser('Bob');
$taro = new User("Taro");

//publicなので書き出されるが$this->nameの部分は書き出されない
echo $bob->sayHello();
//privateなのでエラーになる。
echo $taro->name;

protectedを使

<?php

class User{
    //プロパティ
    public $name;
    protected $color;
    //コンストラクタ
    public function __construct($name,$color){
        $this->name = $name;
        $this->color = $color;
    }
    }
class AdminUser extends User {
    public function sayHello(){
        echo 'hello from Admin',$this->name;
        echo ' your color is ',$this->color;
    }
}

$bob = new AdminUser('Bob','red');

echo $bob->sayHello();
echo $bob->name();
echo $bob->color();

static

インスタンスを作らなくても呼び出せる。

<?php

class User{
    //プロパティ
    public $name;
    //コンストラクタ
    public function __construct($name){
        $this->name = $name;
    }
    public static function Message(){
        echo 'this is static'; 
    }
}
//インスタンス化してなくても呼び出せる
User::Message();

インスタンスを作る度にカウントする。

self
自クラスのプロパティ、及びメソッドへの静的にアクセスする。
<?php

class User{
    //プロパティ
    public $name;
    public static $count = 0;
    //コンストラクタ
    public function __construct($name){
        $this->name = $name;
        self::$count++;//インスタンス化する度にカウント
    }
    public function sayHi(){
        echo "hi, i am $this->name!";
    }
    public static function Message(){
        echo 'this is static'; 
    }
}
echo '最初',User::$count,',';
$suzuki = new User('suzuki');
echo '2回目',User::$count,',';
$sato = new User('sato');
echo '3回目',User::$count;

抽象クラス

他のクラスで継承することを目的としたクラス。

<?php
abstract class BaseUser {
    public $name;
    abstract public function sayHi();//子クラスで必ず実装するメソッド。(この時点で中身を書かなくていい)
}
//BaseUserを継承する子クラス
//nameプロパティを実装しないとエラーになる。
class User extends BaseUser {
    public function sayHi(){
        echo 'This is child class';
    }
}

インターフェイス

interface
このインターフェイスに含まれる全てのメソッドを実装する
カンマで区切って指定することで複数のインターフェイスを実装できる
メソッドのアクセス権は必ずpublicを使う
<?php
interface sayHi {
  public function sayHi();
}
interface sayHello {
  public function sayHello();
}
class User implements sayHi,sayHello {
    public function sayHi() {
        echo 'hello!';
    }
    public function sayHello() {
        echo 'say hello!';
    }
}
$suzuki = new User('suzuki');
echo $suzuki->sayHi();
echo $suzuki->sayHello();