※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);