2019/2/4 遅延静的束縛

http://php.net/manual/ja/language.oop5.late-static-bindings.php

にある例2 static:: のシンプルな使用法を少しずつ変えて動きを見てみる。

<?php
declare(strict_types=1);
ini_set( 'display_errors', '1' );
error_reporting(E_ALL);

class A {
    public function who() {
        echo __CLASS__;
    }
    public function test() {
        static::who(); // これで、遅延静的束縛が行われます
	//$this->who();
    }
}

class B extends A {
    public 

2019/1/15 php laravel static::addGlobalScopeについて

ここ四日ほど止まっている原因、laravel入門のEloquentのグローバルスコープのところで、Personクラスのbootメソッド内に

static::addGlobalScope(){};

を記述する指示があり、この「static::」が何なのか。を考えていた。

PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜

おそらくだが、↑のstatic::部分の最初のサンプルコードの

C <———->Model

CC <———>Person

の対応関係で例えられるような気がする。↑の画像の通り。

ということで、入門本(p243)にある通り、Person.phpのbootメソッド中に

static::addGlobalScope(なんたらかんたら);

と書くことで、グローバルスコープが設定できる、ということ。

Personクラスの__constructは用意していないので、Personクラス生成時にModelクラスの__constructが呼び出される。

間に別のメソッドが入るが大まかに言うと、呼び出された__constructの中で

static::boot();

が実行されるのだが、この「static::」が何を指すか?ここで遅延静的束縛が使われていると思われる。

ここがselfでなくstaticなのでPersonクラスのbootメソッドが呼び出されるので、p243で加えたaddGlobalScopeによりグローバルスコープが設定される、的なことだと思われる。

selfを使うとselfが書かれているクラス、つまりModelクラスのbootメソッドが実行される、つまり期待する動きと違う、と。

static・遅延静的束縛を使えば期待通りの動きになりますね、みたいなことだと思う。違ったらもうわからん、知りません。

多分bootの中ある

static::addGlobalScope(なんたら);

のstaticもやはりPersonクラスを指す(間にあるstatic::boot()などはすっ飛ばして、直近の非転送コールはPersonの__construct呼び出し)ので、p243で記述したコードによりグローバルスコープが設定される、ということかと思われる。

2019/1/5 static変数・メソッド スコープ定義演算子:: について

(注意)記事中に初心者の推測が含まれていますので情報を鵜呑みにするかどうかは自己責任でお願いします。

スコープ定義演算子(::)を使う。

①static(静的)プロパティに静的にアクセス(::(ダブルコロン)を用いてアクセス)をする(実行出来た)

<?php
class supera{
	
	public $d_pro_supa='d_pro_supa';
	
	public function d_meth_supa(){
		echo 'calling d_meth_a';
	}
	
	public static $s_pro_supa='s_pro_supa';
	
	public static function s_meth_supa(){
		echo 'calling meth_a now';
	}
}

class suba extends supera{
	public static function s_meth_suba(){
		echo parent::$s_pro_supa;
	}

2018/1/3 php 名前空間を使ってみる。


<?php
namespace first\aaaa\bbbb\cccc\dddd;

function info(){
	echo '私はFoo_1っす<br>';

<?php
namespace first\aaaa\bbbb\cccc\dddd;

require "Foo_1.php";
require "Foo_2.php";

info();   //私はFoo_1っす

Foo_1.phpに定義されたinfo()関数をFoo_3.phpで呼び出したい。その時に(Foo_3.phpにFoo_1.phpを読み込んで)

Foo_1.phpもFoo_3.phpも名前空間名が同じ

first\aaaa\bbbb\cccc\dddd;

だからFoo_3.phpでは単に

info();

とすれば呼び出せる。\(バックスラッシュ)を使用しない指定方法、これが非修飾形式


<?php
namespace first\aaaa\bbbb\cccc\dddd;

function info(){
	echo '私はFoo_1っす<br>';
}
<?php
namespace first\aaaa;

require "Foo_1.php";
require "Foo_2.php";

bbbb\cccc\dddd\info();