NORILOG Written by Noriaki

初心者のためのオブジェクト指向PHP入門

PHP Programming

  • 「オブジェクト指向プログラミングって難しそう…」
  • 「クラスとかオブジェクトとか言われても、正直よくわからない…」
  • 「実際の開発でどう役立つのかイメージできない…」

このような悩みを持っていませんか?多くのPHP初学者がオブジェクト指向プログラミングの学習につまずきます。でも安心してください。実はオブジェクト指向は一度理解してしまえば、とても強力で便利なプログラミング手法なのです。

はじめに

この記事は、海外の人気プログラミング学習サイトTuts+の『Object-Oriented PHP for Beginners』を翻訳・編集したものです。オブジェクト指向プログラミング(OOP)の基本概念をPHPを通して学びましょう。

“Talk is cheap. Show me the code.”(話よりもコードを見せろ)

プログラミング学習で最も重要なのは実際に手を動かすことです。この記事を読みながら、サンプルコードを書いて試してみてください。

オブジェクト指向プログラミングとは

オブジェクト指向プログラミングとは、関連するデータと機能をクラスとしてまとめるプログラミング手法です。これにより、DRY(Don’t Repeat Yourself:同じことを繰り返すな)という原則に従い、コードの再利用性と保守性を高めることができます。

クラスとオブジェクトの違い

 
クラスは家の設計図のようなもの
オブジェクトはその設計図に基づいて実際に建てられた家
 

クラスを作る

基本的なクラスの構文は次のとおりです:


<?php
class MyClass {
  // クラスのプロパティやメソッドをここに書く
}

// インスタンス化
$obj = new MyClass;
var_dump($obj);

実行結果:

object(MyClass)#1 (0) { }

プロパティとメソッド

クラスにはプロパティ(データ)とメソッド(機能)を定義できます。


<?php
class MyClass {
    public $property1 = "私はクラスのプロパティです";
    
    // プロパティの値を設定するメソッド
    public function setProperty($newval) {
        $this->property1 = $newval;
    }
    
    // プロパティの値を取得するメソッド
    public function getProperty() {
        return $this->property1;
    }
}

$obj = new MyClass;
echo $obj->getProperty() . "<br>";  // 出力:私はクラスのプロパティです
$obj->setProperty("新しい値");
echo $obj->getProperty();  // 出力:新しい値

$thisはオブジェクト自身を参照するキーワードです。メソッド内でプロパティやメソッドにアクセスする際に使用します。

PHPのマジックメソッド

PHPには特定のタイミングで自動的に呼び出されるマジックメソッドがあります。

コンストラクタとデストラクタ


<?php
class MyClass {
    public function __construct() {
        echo "オブジェクトが作成されました<br>";
    }
    
    public function __destruct() {
        echo "オブジェクトが破棄されました<br>";
    }
}

$obj = new MyClass;  // 出力:オブジェクトが作成されました
// スクリプト終了時に自動的にデストラクタが呼ばれる

オブジェクトを文字列として扱う


<?php
class MyClass {
    public $property = "テスト";
    
    public function __toString() {
        return "このオブジェクトのプロパティ: " . $this->property;
    }
}

$obj = new MyClass;
echo $obj;  // 出力:このオブジェクトのプロパティ: テスト

クラスの継承

クラスは他のクラスを継承して、機能を拡張できます。


<?php
class ParentClass {
    public function sayHello() {
        return "こんにちは!";
    }
}

class ChildClass extends ParentClass {
    public function sayGoodbye() {
        return "さようなら!";
    }
}

$child = new ChildClass;
echo $child->sayHello() . "<br>";  // 親クラスのメソッドを使用
echo $child->sayGoodbye();  // 子クラス独自のメソッド

メソッドのオーバーライド

子クラスで親クラスのメソッドを再定義(オーバーライド)することもできます。


<?php
class ParentClass {
    public function sayHello() {
        return "こんにちは!";
    }
}

class ChildClass extends ParentClass {
    // メソッドのオーバーライド
    public function sayHello() {
        return "やあ! " . parent::sayHello();  // 親クラスのメソッドも呼び出す
    }
}

$child = new ChildClass;
echo $child->sayHello();  // 出力:やあ! こんにちは!

アクセス修飾子

PHPには3つのアクセス修飾子があります:

 
1. public – どこからでもアクセス可能
2. protected – そのクラスと子クラスからのみアクセス可能
3. private – そのクラス内でのみアクセス可能
 

<?php
class MyClass {
    public $public = "公開";
    protected $protected = "保護";
    private $private = "非公開";
    
    public function testAccess() {
        echo $this->public . "<br>";    // アクセス可能
        echo $this->protected . "<br>"; // アクセス可能
        echo $this->private . "<br>";   // アクセス可能
    }
}

class ChildClass extends MyClass {
    public function testAccess() {
        echo $this->public . "<br>";    // アクセス可能
        echo $this->protected . "<br>"; // アクセス可能
        // echo $this->private;         // エラー!アクセス不可
    }
}

$obj = new MyClass;
echo $obj->public;    // アクセス可能
// echo $obj->protected; // エラー!アクセス不可
// echo $obj->private;   // エラー!アクセス不可

静的メンバー(static)

静的プロパティとメソッドはインスタンス化せずに使用できます。


<?php
class Counter {
    public static $count = 0;
    
    public static function increment() {
        self::$count++;
        return self::$count;
    }
}

echo Counter::$count . "<br>";  // 出力:0
echo Counter::increment() . "<br>";  // 出力:1
echo Counter::increment();  // 出力:2

オブジェクト指向プログラミングのメリット

1. コードの整理とカプセル化

関連するデータと機能を一つのクラスにまとめることで、コードが整理され、管理しやすくなります。


<?php
class Person {
    private $name;
    private $age;
    
    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
    
    public function sayHello() {
        return "こんにちは、{$this->name}です。{$this->age}歳です。";
    }
    
    public function birthday() {
        $this->age++;
    }
}

$person = new Person("田中", 25);
echo $person->sayHello() . "<br>";  // 出力:こんにちは、田中です。25歳です。
$person->birthday();
echo $person->sayHello();  // 出力:こんにちは、田中です。26歳です。

2. コードの再利用性

継承を使えば、既存のコードを再利用しながら新しい機能を追加できます。

3. メンテナンスの容易さ

オブジェクト指向プログラミングは、変更が必要になった際に影響範囲を局所化し、より安全に修正できます。

実践的な例

ブログ記事を管理するシンプルなクラスを作成してみましょう:


<?php
class BlogPost {
    private $title;
    private $content;
    private $author;
    private $publishDate;
    
    public function __construct($title, $content, $author) {
        $this->title = $title;
        $this->content = $content;
        $this->author = $author;
        $this->publishDate = new DateTime();
    }
    
    public function getTitle() {
        return $this->title;
    }
    
    public function getSummary($length = 100) {
        return substr($this->content, 0, $length) . "...";
    }
    
    public function display() {
        echo "<h2>{$this->title}</h2>";
        echo "<p>投稿者: {$this->author} - 日付: {$this->publishDate->format('Y-m-d')}</p>";
        echo "<div>{$this->content}</div>";
    }
}

$post = new BlogPost(
    "オブジェクト指向PHPの基本",
    "この記事ではPHPのオブジェクト指向プログラミングについて解説します。...",
    "山田太郎"
);

$post->display();

まとめ

オブジェクト指向プログラミングは、コードを整理し、再利用性と保守性を高めるための重要な手法です。この記事で学んだ基本概念をまとめると:

 
クラスとオブジェクト – 設計図とその実体
プロパティとメソッド – データと機能
継承 – 既存のクラスを拡張する
アクセス修飾子 – データの保護と隠蔽
マジックメソッド – 特別な機能を持つメソッド
 

これらの概念を理解し、実際にコードを書いて練習することで、PHPのオブジェクト指向プログラミングをマスターしましょう。