現在の言語: 日本語

戻る

PHPのClosure(クロージャー)
プロパティ関連

「名前のない関数(匿名関数)」を変数に代入したり、他の関数に渡したりできる仕組みです。

[サンプル]

copy
class test1
{
	//従来の書き方(Nullable型)
	public ?Closure $task1 = null;
	//PHP 8.0+ ユニオン型による書き換え
	public Closure|null $task2 = null;
	public function __construct(Closure $task)
	{
		$this->task1 = $task;
	}
	function test1(string $result):string
	{
		$test = function (string $tmp)
		{
			return $tmp." is test data.";
		};
		return $test($result);
	}
	function test2():string
	{
		$result = $this->closureTest(function(){
			return "closureTest";
		});
		return $result;
	}
	private function closureTest(Closure $test):string
	{
		return $test();
	}
	function test3(Closure $task):void
	{
		$this->task2 =$task;
	}
}
echo "<pre>";
$cls1= new test1(fn() => "task1 test");
echo $cls1->test1("test1 method").PHP_EOL;//test1 method is test data.
echo $cls1->test2().PHP_EOL;//closureTest
if($cls1->task1)
{
	echo ($cls1->task1)().PHP_EOL;//task1 test
}
$cls1->test3(function(){ return "task3 test";});
if($cls1->task2)
{
	echo ($cls1->task2)().PHP_EOL;//task3 test
}

echo "</pre>";
copy
class test1
{
	// Traditional syntax (Nullable type)
	public ?Closure $task1 = null;
	// Rewritten using PHP 8.0+ union types
	public Closure|null $task2 = null;
	public function __construct(Closure $task)
	{
		$this->task1 = $task;
	}
	function test1(string $result):string
	{
		$test = function (string $tmp)
		{
			return $tmp." is test data.";
		};
		return $test($result);
	}
	function test2():string
	{
		$result = $this->closureTest(function(){
			return "closureTest";
		});
		return $result;
	}
	private function closureTest(Closure $test):string
	{
		return $test();
	}
	function test3(Closure $task):void
	{
		$this->task2 = $task; 
	}
}
echo "<pre>";
$cls1= new test1(fn() => "task1 test");
echo $cls1->test1("test1 method").PHP_EOL;//test1 method is test data.
echo $cls1->test2().PHP_EOL;//closureTest
if($cls1->task1)
{ 
	echo ($cls1->task1)().PHP_EOL;//task1 test
}
$cls1->test3(function(){ return "task3 test";});
if($cls1->task2)
{ 
	echo ($cls1->task2)().PHP_EOL;//task3 test
}

echo "</pre>";

[従来の書き方(Nullable型)]
public ?Closure $task1 = null;

[PHP 8.0+ ユニオン型による書き換え]
public Closure|null $task2 = null;
プロパティの型にClosureを指定することで、
変数に「関数(クロージャー)」しか代入できないように制限できます。

public function __construct(Closure $task)
{
  $this->task1 = $task;
クロージャーをプロパティのデフォルト値として持たせています。
コンストラクタに無名関数を代入しています。

($cls1->task1)();
実行(呼び出し)の際はプロパティをカッコで囲みます。

(例) PHP 8.4+
[Property Hooks:機能]
class test
{
  public string $data
  {
    set => strtolower($value); // 代入時に自動で小文字化
    get => ucfirst($this->data); // 取得時に自動で先頭大文字化
  }
}
Closureをプロパティに代入しなくても、
プロパティ自体にgetやsetのロジックを直接記述できるようになっています。
実行時に ($this->test1)() のようにカッコが必要です。


戻る

著作権情報
ホームページおよプリ等に掲載されている情報等については、いかなる保障もいたしません。
ホームページおよびアプリ等を通じて入手したいかなる情報も複製、販売、出版または使用させたり、
または公開したりすることはできません。
当方は、ホームページおよびアプリ等を利用したいかなる理由によっての障害等が発生しても、
その結果ホームページおよびアプリ等を利用された本人または他の第三者が被った損害について
一切の責任を負わないものとします。