Octalwerte in einer PHP-Klasse oO

bofh1337

Erfahrenes Mitglied
Langsam habe ich den Eindruck, PHP will mich verarschen :D

Ich schreibe gerade eine Klasse, womit ich Konfig-Dateien usw. beschreiben und erstellen kann, in dieser Klasse ist eigentlich alles vorhanden, was cURL, Fopen Opendir usw. beinhaltet, unter anderen auch eine Möglichkeit, um bei Dateien den CHMOd zu ändern. Die Gültigen CHMod`s sind in einem array festgehalten:

PHP:
    protected $chmodes = array (
        'unlock' => 0777,
        'lock' => 0644
    );

So weit, so gut, aber wenn ich jetzt prüfe, ob "unlock" oder "lock" übergeben wird (von außerhalb der klasse) und den benötigten Wert innerhalb der Klasse setzen will, wird aus 0777 ein Octalwert, womit ich eigentlich nicht arbeiten will.

Hat da jemand einen Tipp für mich? (User www-data schreibt hier nur noch Crap in Sachen Zugriffsrechte :D)
 
Laut Doku müsste PHP damit umgehen können. kannst du mal einen kurzen testcode scheiben und darann zeigen, was genau nicht geht?
 
Schlechte Nachricht: PHP verarscht dich wirklich ;-)

Code:
$test = array( 'l' => 0777, 'u' => 0644 );
function t($val)
{
    global $test;
    var_dump($val);
    var_dump($test);
}

Ein Aufruf von t(0777) liefert auch bei mir
int(511)
array(2) {
["l"]=>
int(511)
["u"]=>
int(420)
}

Es gibt allerdings eine einfache Erklärung: Octals werden in PHP mit führender 0 angegeben: http://php.net/manual/en/language.types.integer.php (PHP hat dir also nicht persönlich den Krieg erklärt).
Bleibt wohl nur, die Werte möglichst lange als String zu verwenden.... intval(0777) liefert zwar 777, aber verschuckt (verständlicherweise) die 0.
 
Ich hab es jetzt so gelöst, sollte wohl auch für PHP eindeutig genug sein :D

PHP:
    public function setCHMOD ($chmod)
    {
        $chmod = (($chmod == 'unlock') ? '0777' : '0644');

        return (bool) @\chmod (self::$file, $chmod);
    }
 
Harrier hat gesagt.:
intval(0777) liefert zwar 777, aber verschuckt (verständlicherweise) die 0.

Nein, das liefert natürlich auch 511. Du meinst wahrscheinlich intval("0777"). Bei Umwandlung von String?Integer kennt PHP nur das Dezimalsystem und schneidet „aus Kulanz“ führende Nullen weg.

bofh1337 hat gesagt.:
Ich hab es jetzt so gelöst

Nein, damit dürftest du es dir zerschossen haben. :)

So geht es:

PHP:
<?php

class Foo
{
    protected $modes = array(
        'unlock' => 0777,
        'lock'   => 0644
    );
    
    public function setPermissions($file, $mode)
    {
        if (!array_key_exists($mode, $this->modes)) {
            return false;
        }
        
        return chmod($file, $this->modes[$mode]);
    }
    
    public function getPermissions($file)
    {
        clearstatcache(true, $file);
        return substr(sprintf('%o', fileperms($file)), -4);
    }
}

$file = __DIR__ . '/test';

touch($file);

$foo = new Foo();

var_dump(
    $foo->setPermissions($file, 'lock'),
    $foo->getPermissions($file)
);
var_dump(
    $foo->setPermissions($file, 'unlock'),
    $foo->getPermissions($file)
);
var_dump(
    $foo->setPermissions($file, 'lock'),
    $foo->getPermissions($file)
);

// bool(true)
// string(4) "0644"
// bool(true)
// string(4) "0777"
// bool(true)
// string(4) "0644"
 
Zurück