現在の言語: 日本語

戻る

resource型
php型宣言

resourec型はPHPの外部にある特別なリソースへの参照(ハンドル)を保持するためのデータ型です。
通常のデータ型(int/string/array等)とは異なり
外部システムと連携する際に使用されます。
ただし、関数の引数に使用可能なの型宣言 resourceはphp ver7.4までとなります。
(例)
function test(resource $handle)
{
...
}
resourceの代替としてphp8.0からはstreamなどの用途に応じた型宣言が使用できるようになっているようです。

[サンプル]

copy
class test1
{
  function fileTest()
  {
    // ファイルを開き、リソースを取得する
    $handle = fopen('aaa.txt', 'r');
    if(is_resource($handle))
    {
      echo "有効なリソース型です。".PHP_EOL;//有効なリソース型です。
    }
    else
    {
      echo "リソース型ではありません。".PHP_EOL;
    }
    if ($handle) 
    {
        // リソースを使用してファイルから読み込む
        while (($line = fgets($handle)) !== false) 
        {
            echo $line;
        }
        // リソースを閉じて解放する
        fclose($handle);
    }
  }
}
echo "<pre>";

$cls1 = new test1();
$cls1->fileTest();

echo "</pre>";
copy
class test1
{
	function fileTest()
	{
			// Open the file and get the resource
			$handle = fopen('aaa.txt', 'r');
			if(is_resource($handle))
			{
				echo "Valid resource type." PHP_EOL; // Valid resource type.
			}
			else
			{
			e	cho "Not a resource type." PHP_EOL;
			}
			if ($handle)
			{
				// Read from the file using the resource
				while (($line = fgets($handle)) !== false)
				{
					echo $line;
				}
				// Close and release the resource
				fclose($handle);
			}
	}
}
echo "<pre>";

$cls1 = new test1();
$cls1->fileTest();

echo "</pre>";

ファイルが正しくopenできた場合はis_resource関数がtrueを返します。
ファイル名が間違っている場合はopenできません。
その場合はis_resource関数がfalseを返します。
ファイルポインタはphpではリソース型として表現されます。
ファイルポインタを使うとファイル内の現在位置を追跡しながら
ファイルの一部を読み書きするといった行動な操作が可能になります。

関数名説明
fopenファイルを開き、操作に必要なリソースを取得します。
fwirteリソースが指す現在位置にデータを書き込みます。書き込み後、ポインタは書き込んだデータの終端へ移動します。
ftellリソースが現在ファイル内のどこを指しているか?バイト数を確認します。
fseekリソースのポインタ位置を任意の位置(先頭から何バイト目など)に移動させます。こにれよりう、ファイルの一部だけを読み書きできます。
freadリソース(ファイルポインタ)の現在位置から指定したバイト数のデータを読み込みます。
fclose使用後のリソースを解放し、ファイルを閉じます。


copy
class test2
{
  function test()
  {
    $ary = [];
    // ファイルを開き、リソースを取得する
    $handle = fopen('memo.txt', 'r');
    if(is_resource($handle))
    {
      echo "有効なリソース型です。".PHP_EOL;//有効なリソース型です。
    }
    else
    {
      echo "リソース型ではありません。".PHP_EOL;
    }
    $ary = $this->fileTest($handle);
    // リソースを閉じて解放する
    fclose($handle);
    for($i=0; $i < count($ary); ++$i)
    {
        echo $ary[$i].PHP_EOL;
    }
  }
  
  //private function fileTest(resource $handle):array
  //private function fileTest(stream $handle): array
  private function fileTest($handle): array
  {
    $ary =[];
    if ($handle) 
    {
        while (($line = fgets($handle)) !== false) 
        {
            $ary[] = $line;
        }
    }
    return $ary;
  }

}
echo "<pre>";

$cls = new test2();
$cls->test();

echo "</pre>";
copy
class test2
{
	function test()
	{
		$ary = [];
		// Open the file and get the resource
		$handle = fopen('memo.txt', 'r');
		if(is_resource($handle))
		{
			echo "This is a valid resource type." PHP_EOL; // This is a valid resource type.
		}
		else
		{
			echo "Not a resource type." PHP_EOL;
		}
		$ary = $this->fileTest($handle);
		// Close and release the resource
		fclose($handle);
		for($i=0; $i < count($ary); ++$i)
		{
			echo $ary[$i].PHP_EOL;
		}
	}
		
	/private function fileTest(resource $handle):array
	/private function fileTest(stream $handle): array
	private function fileTest($handle): array
	{
		$ary =[];
		if ($handle)
		{
			while (($line = fgets($handle)) !== false)
			{
				$ary[] = $line;
			}
		}
		return $ary;
	}
	
}
echo "
";

$cls = new test2();
$cls->test();

echo "</pre>";
型宣言 resourceはphp ver7.4までとなります。
そのため型宣言をしないのが確実な実装方法となります。
関数の引数として型にstreamを使ってエラーになる場合について
PHP 8.0以降でもネイティブな型ヒントとしては完全にはサポートされていない、
あるいは特定の環境構成では利用できないケースがあります。
当環境ではresource型もstream型もエラーが発生しているので
型宣言を記述していません。
しかし、通常はphp ver8.0以降の環境をご利用であれば
問題なくstream型を使用できるはずです。
しかし、当環境のようにエラーが発生する場合は型宣言を記述しない対応をしてください。



戻る

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