tabimoba.net

とあるエンジニアの雑記帳

PHPでmkdir時に4桁のパーミッションを文字列型の変数の値より指定するには

※Qiitaからの移行記事となります

PHPのmkdir関数でディレクトリを作成する際に8進数4桁のパーミッションを指定する場合、mkdir関数の第2引数へ

mkdir('/var/dat/hogefuga', 0755, true);

のような形で指定することで、0755(rwxr-xr-x)というパーミッションのディレクトリが作成されます。

変数でセットする場合も、

$perm = 0755;
mkdir('/var/dat/hogefuga', $perm, true);

とすることで、上記と同様のパーミッションでディレクトリを作成することができます。

しかし、変数が文字列型である場合、例えば

$perm = '0755';
mkdir('/var/dat/hogefuga', $perm, true);

である場合、0755(rwxr-xr-x)とならず(例えば、-wxr---tのようになり)、意図したパーミッションとならない場合があります。

変数が文字列型であるケースとしては、Webシステムから送信された値や、DBやAPI、ファイル等から取得した値を使用するケースが挙げられます。

原因

文字列型の値は、10進数の数値として扱われます。つまり、0755(8進数)ではなく、755(10進数)として扱われます(先頭の0は無視されます)。 これにより、意図したパーミッションでディレクトリを作成することが出来ません。

対応

octdec関数で文字列型を8進数の整数へ変換することで、この問題を解消することができます。

<?php
$perm = '0755';
$mydir = '/var/dat/hogefuga';

mkdir($mydir, octdec($perm), true);

参考