のぐそんブログ

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

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()
?>

PHP超初心者のメモ

初心者の私が、PHPを勉強していて少し気になったことを自分用にメモしています。 少しずつ足していきます。

phpのスコープ

phpでfor文やif文の中はブロックスコープになりません。 関数の中はブロックスコープになります。

<?php
function func(){
    $hoge = '1';
}

var_dump($hoge); // NULL
?>

もしfor文などの中で変数を定義した場合は、その後利用しないのであれば、unsetしたほうがよさそうです。

<?php
$a = [1,2,3];
foreach ( $a as $value){
    $b = 2;
    $value += $b;
}

var_dump($b); // int(2)
unset($b);
var_dump($b); // NULL
?>

引数の参照渡し

関数の引数の頭に & をつけると引数の修正が可能になります。

<?php
function func(&$var){
    $var ++;
}

$hoge = 1;
func($hoge);
echo $hoge; //1
?>

引数を参照渡しにするケースがあるのかが疑問でしたが、以下のように使う場合無駄な変数を定義しなくてすむので便利です。

<?php
function func(&$var){
    return $var += 10;
}

$hoge = 1;
    echo func($hoge); //11
?>

タイプヒンティング(型宣言)

関数にわたす引数の型を定義することができます。

<?php
function func(int $var){
    return $var + 10;
}

$hoge = 1;
func($hoge);
echo $hoge; //1
?>

phpクロージャーを使う

phpクロージャーを利用する場合、親スコープから変数を引き継ぐ場合にuseを利用する必要があります。

<?php
$count = function(){
    $n = 0;
    return function() use (&$n){
        return ++$n;
    };
};

$func = $count();
echo $func(); // 1
echo $func(); // 2
echo $func(); // 3
?>

定義済み関数の取得

PHPには定義済みの関数があります。 1つは、PHPにで利用できる関数。 もう一つは、プラグインなどをインストールすることで利用できる関数です。

どのような定義済み関数があるか以下で確認できます。 でもたくさんありすぎて見ずらいです。。。

<?php
var_dump(get_defined_functions());
?>

$self と $thisの使い分け

$self と $thisの使い分けがいまいちわかりませんでした。 簡単な使い分けとしては以下になるのでしょうか。。。

$self ・・・ 自クラスの静的(static)プロパティや、メソッドにアクセスするときに使う $this ・・・ 自クラスの動的(staticがついていない)プロパティやメソッドにのアクセスするときに使う

PHPのヒアドキュメントやNowdocのメモ

複数行にまたがる文字列を扱うときに便利なヒアドキュメントやNowdoc。 EOMは他の文字でもOK(開始と終了が同じ文字なら)。 よく使われるのがEOM(End Of Message)みたい。

続きを読む

PHPで定数を利用するメモ

定数の定義

定数定義にはdefineかconstを利用します。 defineとconstの違いは、defineはnamespaceの影響を受けないけど、constは受けるだけなのでしょうか。。。

define

define('ABC','ほげほげ');
echo ABC; // ほげほげ

const

const ABC = 'ほげほげ';
echo ABC; // ほげほげ
続きを読む