Classをどのように書いて、どのように利用するかはいつの時代も悩ましいところですが、最近だとrequireとかじゃなくて、composerのautoloadをprs-4でやったりするらしいので、その方法についてメモしたいと思います。
STEP1: まずは、素の状態
1つのファイルに全て書きます。
requireともnamespaceとも無縁です。が、実務でこれを利用することは無いですよね。。
test.phpに全部書きます。
<?php
//class A
class A{
public $name = "";
public function __construct()
{
$this->name = "nanashi";
}
public function Hello()
{
echo $this->name."\n";
}
}
//class B
class B extends A{
public $email = "";
public function Send()
{
echo "Send mail to ".$this->email."\n";
}
}
//Main
$b = new B();
$b->Hello();
$b->Send();
STEP2: クラスをファイル別に分けてrequire
次に、クラスをファイルごとに分けて、各ファイルで必要なものをrequireする方法。
いちおう、classesというフォルダを作成し、その下にA.php, B.phpを作成し、それぞれクラスA、クラスBを記述します。
test.php
/classes
-A.php
-B.php
Class A
クラスAはただ切り出しただけです。
<?php
//class A
class A{
public $name = "";
public function __construct()
{
$this->name = "nanashi";
}
public function Hello()
{
echo $this->name."\n";
}
}
Class B
クラスBはクラスAを利用するので、A.phpをrequireします。
<?php
require_once __DIR__.'/../classes/A.php';
//class B
class B extends A{
public $email = "";
public function Send()
{
echo "Send mail to ".$this->email."\n";
}
}
メインのtest.phpは、クラスBを利用するのでB.phpをrequireしています。
クラスが多くなるとちょっと管理がしんどいですね。
<?php
require_once __DIR__.'/classes/B.php';
//Main
$b = new B();
$b->Hello();
$b->Send();
STEP3: PSR-4対応でAutoload
では、最後にnamespaceというか、それを利用したautoloadに対応させたいと思います。
composer.json
まずは、autoload.phpを生成するためにcomposer.jsonを定義します。Sampleという名前空間(プリフィックス)にclassesフォルダをマップしています。
{
"autoload": {
"psr-4": {
"Sample\\" : "classes/"
}
}
}
vendor/autoload.phpの生成
jsonの設定が終わったら、下記コマンドでautoload.phpを生成(更新)します。
composer dump-autoload
Class A
クラスAは、下記のようにnamespaceを追加します。
PRS-4だと上にnamespace書かないといけませんね。
<?php
namespace Sample;
//class A
class A{
public $name = "";
public function __construct()
{
$this->name = "nanashi";
}
public function Hello()
{
echo $this->name."\n";
}
}
Class B
クラスBも同様にnamespaceを追加し、かつ、クラスAを利用するので、use Sample\A;としています。
<?php
namespace Sample;
use Sample\A;
//class B
class B extends A{
public $email = "";
public function Send()
{
echo "Send mail to ".$this->email."\n";
}
}
メインファイルでは、autoload.phpをrequireします。
そして、クラスBを利用するので、use Sample\ B;としています。
<?php
require_once __DIR__.'/vendor/autoload.php';
use Sample\B;
//Main
$b = new B();
$b->Hello();
$b->Send();