こんな人に読んでほしい
- そもそもpublic, protected, privateって何?
- それぞれの違いが説明できない
- 違いを分かりやすく確認したい
早速見ていきましょ!!!
public
どこからでも呼び出し可能。
これが基礎的な呼び出し方で、分かりやすい。
メリット
実装者にとっては、どこからでも呼び出しやすく使いやすい。
デメリット
ファイル数が増えると、どこに記述されたメソッドか分かりにくい。
実際のコード
<?php
class Test
{
public function public(){
echo "public test";
}
}
$test = new Test;
// Testクラスのpublicメソッドを呼び出す
$test->public();
?>
出力結果:public function
protected
クラス内からと継承クラスからは呼び出し可能。
メリット
うまく継承できれば、簡単に実装を行うことができる。
デメリット
複数のファイルで継承されると、どこが親のクラスかが分かりにくい。
実際のコード
<?php
// 親クラス
class TestParent
{
protected function protectedFunc(){
echo "protected function";
}
}
class TestChild extends TestParent
{
public function callTestParent() {
TestParent::protectedFunc();
}
}
// 親クラスで呼び出し
$test_parearent = new TestParent;
$test_parearent->protectedFunc(); // エラーになります
// 子クラスで呼び出し
$test_child = new TestChild();
// ここでcallTestParentメソッドを呼び出し、親クラスを返す(※出力結果)
$test_child->callTestParent();
?>
出力結果(17行目をコメントアウトした場合):protected function
17行目のエラー文
PHP Fatal error: Uncaught Error: Call to protected method TestParent::protectedFunc() from global scope in /workspace/Main.php:17
Stack trace:
#0 {main}
thrown in /workspace/Main.php on line 17
継承されていないので、エラーとなってしまう。
private
クラス内からのみ、呼び出し可能。
堅牢なシステム設計を行う為には、まずprivateにできないかを確認する。
メリット
クラス外から呼び出すことはできない為、保守性の高いコードが書ける。
デメリット
他のクラスから呼び出しができない為、使い勝手が悪い。
実際のコード
<?php
class Test
{
private $test;
public function __construct($test)
{
$this->test = $test;
}
public function testPublic(Test $call_private)
{
// publicからtestPrivateを呼び出す
$call_private->testPrivate();
}
private function testPrivate()
{
echo "private function";
}
}
$testInstance = new Test('test');
$testInstance->testPrivate(new Test('other')); // エラーになります
// publicのtestPublicメソッドを呼び出す(※出力結果)
$testInstance->testPublic(new Test('call_private'));
?>
出力結果(24行目をコメントアウトした場合):private function
24行目のエラー文
PHP Fatal error: Uncaught Error: Call to private method Test::testPrivate() from global scope in /workspace/Main.php:24
Stack trace:
#0 {main}
thrown in /workspace/Main.php on line 24
クラス外からTestクラスのtestPrivateメソッドを出力することはできない。
参考記事
継承は悪か?
まとめ
functionが使えるようになると楽になります。
また、使うものにもよりますが、コードの保守性も高まります。
コメント