PHP中級者になるために知っておきたい知識とは? 〜その2〜

中級者向けの知識は、「普段はあまり使うことが無い知識」になってしまうこともありますが、「どのような知識なのか?」を知っておくと、プログラミングの幅も広がっていきますので、少しずつスキルレンジを広げていきましょう。

中級者になるためのさまざまな機能

遅延静的束縛

「遅延静的束縛」は、継承した子クラスから親クラスのメソッドなどを実行することができます。

class Car{
  private $type;
  private $maker;
  private $tires;
  
  function __construct($type, $maker, $tires){
    $this->type = $name;
    $this->maker = $maker;
    $this->tires = $tires;
  }
  
  public static function sayClass(){
    echo '私は、', __CLASS__,'です。こんにちは';
  }
    
}

class MiniCar extends Car {
  
  public static function sayClass(){
    echo '私は、', __CLASS__,'です。こんにちは';
  }
}
$car = new MiniCar('4WD', 'hoge', 4);
$car->sayclass();

このプログラムを実行すると、Carクラスの継承先の子クラス(MiniCarクラス)のsayClassメソッドが実行され、出力結果は、

 
私は、Carです。こんにちは

と出力され、親クラスのsayClassメソッドが実行されています。

子クラスのメソッドを呼び出すには、次のように「sayメソッド」の記述を変更する必要があります。

public function say(){
    static::sayClass();
}

このように「self」キーワードを「static」に変更することで、MiniCarクラスのsayClassメソッドが実行されます。出力結果は次のようになります。

私は、MiniCarです。こんにちは

名前空間

「名前空間」は、クラスをより大きなパッケージで包み込んで管理する仕組みです。

// MyCompany.php
namespace MyCompany\Develop;

class Hoge {
  public function work(){
    echo 'working now.';
  }
}

もう一つ新しいファイルを作り「MyCompany.php」ファイルを読み込みます。

// Work.php
require 'MyCompany.php';

$company = new MyCompany\Develop\hoge();

$company->Work();

このように名前空間を指定して「hoge」クラスのインスタンスを作ることができます。

リファレンスカウント

PHPでは、オブジェクトを変数に代入した際に「参照」が渡されるようになっていますが、この参照の数を数える仕組みが「リファレンスカウント」です。

「リファレンスカウント」によってそのオブジェクトが存在する期間を決めています。

どこからも参照されなくなったオブジェクトが、メモリ内に「ゴミ」として残り続けてしまうため、「リファレンスカウントが無くなると、オブジェクトが破棄される仕組みとなっています。

class Hoge {
  public function work(){
    echo 'working now.';
  }
  
  public function __destruct(){
    echo "Losed Object.";
  }
}

$ref_hoge1 = new Hoge();
$ref_hoge2 = $ref_hoge1;
unset($ref_hoge1);
echo "ref_hoge losed.";
unset($ref_hoge2);

出力は、

ref_hoge losed.
Losed Object.

なります。

この機能は「ガベージコレクション」と呼ばれるオブジェクトの管理と破棄を行う仕組みの中の一つです。

イテレータ

「イテレータ」はforeach文による繰り返しを行う際に使われる仕組みです。

イテレータを利用するクラスには、Iteratorインターフェースを実装しますが、次のメソッドを実装する必要があります。

  • rewind
  • current
  • key
  • next
  • valid

これらのメソッドをIteratorを適用するクラス内に実装します。

class Hoge implements Iterator{
  private $hoges = array();
  
  public function __construct(array $vals) {
    $this->hoges = $vals;
  }
  
  //現在位置を先頭に移動
  public function rewind() {
    reset($this->hoges);
  }
  
  //現在位置の要素を返す
  public function  current() {
    return current($this->hoges);
  }
  
  //現在位置の参照キーを返す
  public function key() {
    return key($this->hoges);
  }
  
  //現在位置を次へ移動
  public function next() {
    return next($this->hoges);
  }
  
  //現在位置の値の有効性をチェック
  public function valid() {
    return ($this->current() !== false);
  }
}

$hoges = array('hoge1','hoge2','hoge3');

$iter = new Hoge($hoges);

foreach($iter as $k => $v ){
  echo $k . '-->' . $v;
}

出力結果は次のようになります。

0-->hoge1
1-->hoge2
2-->hoge3

ジェネレータ

「ジェネレータ」を利用すると、イテレータの実装をより簡潔に行うことができます。

class Hoge {
  public $hoges = array('hoge1','hoge2','hoge3');
  
  public function hogeGenerator(){
    foreach($this->hoges as $key => $value){
      yield $key => $value;
    }
  }
}

$hoge = new Hoge();

foreach($hoge->hogeGenerator() as $key => $value){
  echo $value;
}

出力結果は次のようになります。

hoge1
hoge2
hoge3

ジェネレータの動作は下記のURLのスライドで詳しく紹介されています。

→「Generator」

→「前へ」

HOMEへ