のぐそんブログ

暗いおじさんがシコシコ書くブログです。

PHPのClassの基礎基礎メモ

Classの基本

Classの使い方

こんな感じのの簡単なクラス。

<?php

namespace MyClass;

class MyClass
{

    private $last_name = '鈴木';
    public $first_name = '一郎';

    public function my_name()
    {
        echo $this->last_name . $this->first_name;
    }
}

使うほうはこんな感じ。

<?php
require_once 'MyClass.php';
use MyClass\MyClass;

$my_class = new MyClass();
$my_class->my_name(); // 鈴木一郎
$my_class->first_name = '太郎';
$my_class->my_name(); // 鈴木太郎

?>

Classで利用できるアクセス修飾子

クラスで利用できるアクセス修飾子は3つ。

アクセス修飾子 説明
public どこからでも参照、呼び出しができる
private 自分のクラス内でのみ参照、呼び出しができる
protected 自分のクラス、もしくは自分のクラスを継承しているクラスのみ参照、呼び出しができる

privateのプロパティにアクセスしようとするとエラーになる。

<?php
require_once 'MyClass.php';
use MyClass\MyClass;

$my_class = new MyClass();
$my_class->last_name = '伊藤'; // Uncaught Error: Cannot access private property 
$my_class->my_name(); 

?>

クラス内でprivateプロパティにアクセスしてみる。

<?php

namespace MyClass;

class MyClass
{
    function __construct()
    {
        echo '私の名前は';
    }

    private $last_name = '鈴木';
    public $first_name = '一郎';

    public function my_name()
    {
        echo $this->last_name . $this->first_name,PHP_EOL;
    }

    public function change_last_name()
    {
        $this->last_name = '伊藤';
    }
}

以下のように変更することができる。

<?php
require_once 'MyClass.php';
use MyClass\MyClass;

$my_class = new MyClass();
$my_class->first_name = '太郎';
$my_class->change_last_name();
$my_class->my_name(); // 伊藤太郎

?>

クラスに未設定のプロパティについて

以下のようにクラスに未設定のプロパティの読み書きも可能です。

<?php
require_once 'MyClass.php';
use MyClass\MyClass;

$my_class = new MyClass();
$my_class->first_name = '太郎';
$my_class->age='30';
$my_class->my_name(); // 伊藤太郎

?>

ただし、プログラムの見通しが悪くなるのであまり利用しないほうが良さそうです。

staticプロパティ

クラスのプロパティはインスタンスごとに管理する値のインスタンス変数になります。 staticをつけて定義した場合は、クラス全体に影響するクラス変数になります。

<?php

namespace MyClass;

class MyClass
{

    private $last_name = '鈴木';
    public $first_name = '一郎';
    public static $biz = '株式会社ほげほげ';

    public function my_name()
    {
        echo self::$biz . 'の' . $this->last_name . $this->first_name,PHP_EOL;
    }

    public function change_last_name()
    {
        $this->last_name = '伊藤';
    }
}

staticプロパティを書き換えた場合、クラス全体に影響します。

<?php
require_once 'MyClass.php';
use MyClass\MyClass;

$my_class = new MyClass();
$my_class::$biz = '有限会社フガフガ';
$my_class->first_name = '太郎';
$my_class->my_name(); // 有限会社フガフガの鈴木太郎


$my_class2 = new MyClass();
$my_class2->first_name = '次郎';
$my_class2->my_name(); // 有限会社フガフガの鈴木次郎

?>

定数について

クラスの定数は、constキーワードを利用します。 定数は変数のように、$をつけません。 アクセスできる範囲はpublicです。

<?php

namespace MyClass;

class MyClass
{
    const YEAR = 2019;
    
    public function shoConst(){
        echo self::YEAR;
    }
}
<?php
require_once 'MyClass.php';
use MyClass\MyClass;

$my_class = new MyClass();
$my_class->shoConst(); // 2019

?>

関数

static メソッド

staticメソッドは、インスタンス化されていないくても外部から呼ぶことができます。 また、$thisを利用することができずselfを利用します。

<?php

namespace MyClass;

class MyClass
{
    private static $name = '太郎';

    public static function get_name(){
        return self::$name;
    }

    public static function set_name($v){
        self::$name = $v;
    }
}

こんな感じになる。直接クラスから呼び出すこともできる。

<?php
require_once 'MyClass.php';
use MyClass\MyClass;

$my_class = new MyClass();
echo $my_class->get_name(); //太郎

MyClass::set_name('TAEO');
echo MyClass::get_name(); // TARO

?>

コンストラク

コンストラクタはインスタンスが作成されるタイミングで実行されます。

<?php

namespace MyClass;

class MyClass
{
    private $name;

    public function __construct($v)
    {
        $name = $v;
        echo $name;
    }
}
?>

こんな感じで、インスタンスを作ったタイミングで実行される。

<?php
require_once 'MyClass.php';
use MyClass\MyClass;

$name = '太郎';
$my_class = new MyClass($name); // 太郎
?>

デコンストラク

インスタンスが消された(スクリプトが終了した)タイミングで実行されます。

<?php

namespace MyClass;

class MyClass
{

    public function __construct()
    {
        echo 'インスタンスを作成';
    }

    public function hello(){
        echo 'hello';
    }

    function __destruct(){
        echo 'インスタンスを破棄';
    }
}

こんな感じ。

<?php
require_once 'MyClass.php';
use MyClass\MyClass;

$my_class = new MyClass(); //インスタンスを作成
$my_class->hello(); // hello

// インスタンスを破棄

?>

継承

クラスの継承はextendsキーワードを利用します。

class subClass extends SuperClass{
...
} 

オーバーライド

親クラスの定義を子クラスで同じ名前で定義すると上書きできることをオーバーライドと言います。

親クラス
<?php

class SuperClass
{
    public $name = '太郎';

    public function show_name(){
        echo $this->name;
    }
}
子クラス
<?php

require_once 'SuperClass.php';

class SubClass extends SuperClass
{
    public $name = 'TARO';
}

実行すると$nameが子クラスの値でおきかえられます。

<?php
require_once 'SubClass.php';

$my_class = new SubClass(); 
$my_class->show_name(); //TARO
?>

parentキーワード

子クラスの中から親クラスの操作をしたい場合はparentキーワードを利用します。

親クラス
<?php

class SuperClass
{
    private $name = '太郎';

    public function __construct($v)
    {
        $this->name = $v;
    }

    public function show_name(){
        echo $this->name;
    }
}
子クラス

子クラスから親クラスのコンストラクタを実行してみる。

<?php

require_once 'SuperClass.php';

class SubClass extends SuperClass
{
    private $name = '小太郎';

    public function __construct()
    {
        parent::__construct($this->name);
    }
}

実行してみる。

<?php
require_once 'SubClass.php';

$my_class = new SubClass(); 
$my_class->show_name(); //小太郎
?>

finalキーワード

finalキーワードをつけてメソッドを宣言すると、子クラスからのオーバーライドができなくなります。

親クラス
<?php

class SuperClass
{
    private $name = '太郎';

    public final function show_name(){
        echo $this->name;
    }
}
子クラス
<?php

require_once 'SuperClass.php';

class SubClass extends SuperClass
{

    private $age = 25;

    public function show_name(){
        echo $this->age;
    }
}

実行するとエラーになる。

<?php
require_once 'SubClass.php';

$my_class = new SubClass(); 
$my_class->show_name(); //Cannot override final method SuperClass::show_name()
?>