16
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPのクラスの書き方(というか、素のクラス利用からオートロード利用の対応ステップ)まとめ

Last updated at Posted at 2016-05-23

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();
16
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?