2015-02-23 36 views
5

我的代碼是這樣更改「0777」字符串爲0777八進制LITERALLY

$perm = "0777"; //this is fetch from the database 
chmod("myFolder/", $perm); 

但$燙髮的價值並不在八進制,我怎樣才能改變變量的數據類型爲八進制?即使是一種替代方法也會這樣做

回答

0

八進制不是一種類型。整數是類型。

你想要將一個字符串轉換爲一個int,並且由於該字符串以零開頭,它將是一個八進制整數。

使用intval此:

chmod('myFolder/', intval($perm)); 
+0

這是行不通的,因爲這個字符串會被轉換爲'int(777)',並且前導零將消失! – Rizier123 2015-02-23 11:02:02

+0

閱讀文檔,我特別加了鏈接......「如果字符串以」0「開始,基數取爲8(八進制);」 – Blaatpraat 2015-02-23 11:03:43

+0

我只會給你腳本:'echo $ perm = intval(「0777」); \t chmod(「test /」,$ perm); \t回聲「
」。 substr(sprintf('%o',fileperms('test /')),-4);'創建一個測試文件夾並測試它!看看它是否輸出0777作爲權限! – Rizier123 2015-02-23 11:05:35

4

至於有人提到,沒有八進制數的類型。而chmod函數接收第二個參數作爲整數。 $perm的隱式轉換不假定該數字是八進制數。因此,您需要使用適當的函數將「八進制字符串」轉換爲整數。

只需使用octdec功能

$perm = "0777"; //this is fetch from the database 
chmod("myFolder/", octdec($perm)); 

或者intval

chmod("myFolder/", intval($perm, 8)); 

附:

var_dump('0644' == 0644);    // bool(false) 
var_dump(intval('0644') == 0644);  // bool(false) 
var_dump(decoct('0644') == 0644);  // bool(false) 

var_dump(octdec('0644') == 0644);  // bool(true) 
var_dump(intval('0644', 8) == 0644); // bool(true) 
0

沒有什麼似乎爲我工作,所以我只是創建了一個非常愚蠢的解決方案,我只是要發佈在這裏。

function permtooct($permissions) {  

    $mode = 0; 
    if ($permissions[0] == '1') $mode += 01000; 
    if ($permissions[0] == '2') $mode += 02000; 
    if ($permissions[0] == '3') $mode += 03000; 
    if ($permissions[0] == '4') $mode += 04000; 
    if ($permissions[0] == '5') $mode += 05000; 
    if ($permissions[0] == '6') $mode += 06000; 
    if ($permissions[0] == '7') $mode += 07000; 

    if ($permissions[1] == '1') $mode += 0100; 
    if ($permissions[1] == '2') $mode += 0200; 
    if ($permissions[1] == '3') $mode += 0300; 
    if ($permissions[1] == '4') $mode += 0400; 
    if ($permissions[1] == '5') $mode += 0500; 
    if ($permissions[1] == '6') $mode += 0600; 
    if ($permissions[1] == '7') $mode += 0700; 

    if ($permissions[2] == '1') $mode += 010; 
    if ($permissions[2] == '2') $mode += 020; 
    if ($permissions[2] == '3') $mode += 030; 
    if ($permissions[2] == '4') $mode += 040; 
    if ($permissions[2] == '5') $mode += 050; 
    if ($permissions[2] == '6') $mode += 060; 
    if ($permissions[2] == '7') $mode += 070; 

    if ($permissions[3] == '1') $mode += 01; 
    if ($permissions[3] == '2') $mode += 02; 
    if ($permissions[3] == '3') $mode += 03; 
    if ($permissions[3] == '4') $mode += 04; 
    if ($permissions[3] == '5') $mode += 05; 
    if ($permissions[3] == '6') $mode += 06; 
    if ($permissions[3] == '7') $mode += 07; 

    return($mode); 
} 
$a = "0777"; 
chmod("myFolder/", permtooct($a)); 
0

我需要喂chmod()模式組件作爲函數內的變量。我花了足夠的時間嘗試(和失敗)將字符串轉換爲八進制數,同時保持0777值。最後,我決定放棄chmod()/ftp_chmod()並選擇ftp_site(),它不會在字符串模式代碼上窒息。

if(!ftp_site($connection,"chmod {$mode} {$path}/{$file}")){ 
    // handle the error 
} 

這對我有用。如果這是某種缺陷或不是最佳做法,請解釋。

編輯:一些讀者可能會拒絕這個ftp_解決方案作爲作弊,因爲它不是一個文件系統功能解決方案。這對我來說不是問題,因爲我正在寫一個ftp類的函數。

相關問題