2010-01-09 2 views
3

Я изучаю исходный код WordPress, который работает с файловой системой, когда я нажимаю эти несколько строк, и я действительно не совсем уверен, что они делают?stat() и оператор амперсанда

$stat = stat(dirname($new_file)); 
$perms = $stat['mode'] & 0000666; 
@ chmod($new_file, $perms); 
+2

+1 за действительный вопрос учитывая, что вы не видите много используя битовые операторы PHP. Для получения дополнительной информации о побитовых операторах, пожалуйста, ознакомьтесь с http://php.net/manual/en/language.operators.bitwise.php –

ответ

3

Этот код использует операции побитового для обеспечения того, чтобы права доступа файла не выше, чем 666. Чтобы разбить его:

// Retrieves the file details, including current file permissions. 
$stat = stat(dirname($new_file)); 

// The file permissions are and-ed with the octal value 0000666 to make 
// sure that the file mode is no higher than 666. In other words, it locks 
// the file down, making sure that current permissions are no higher than 666, 
// or owner, group and world read/write. 
$perms = $stat['mode'] & 0000666; 

// Finally, the new permissions are set back on the file 
@chmod($new_file, $perms); 
+1

«для обеспечения того, чтобы в этом случае был установлен определенный атрибут файла» или «не установлен»: все, что не содержится в 666 (rw-rw-rw-), удаляется - на практике это означает выполнение бит. – Wim

+0

Большое спасибо Джону! Но я предполагаю, что если файл perms уже был, например, 600, то $ perms останется 600? – TheDeadMedic

+0

@ TheDeadMedic - Правильно. Код удаляет только разрешения, он их не добавляет. –

1

Он изменяет разрешение, позволяющее писать в каталоге .. Я думаю. Выезд stat() и chmod().

+0

Да, но зачем сначала получать информацию о chmod и почему '&' это с 666? Я тоже этого не понимаю. Посмотрим, придет ли кто-нибудь, кто может решить эту загадку. –

+0

Он отбрасывает лишние биты и сохраняет только часть 'rwxrwxrwx', в зависимости от того, какие биты ее установлены. – Blindy

0

0666 - это восьмеричная нотация для разрешений unix rwxrwxrwx, поэтому я принимаю, что $stat['mode'] возвращает разрешения папки. Затем они получают поразрядные AND'ed с помощью маски 0666, чтобы проверить, есть ли у вас как минимум права на чтение/запись/выполнение для себя, группы и других.

+3

'x' разрешения бит 0 (1 в шестнадцатеричном/восьмеричном), они не установлены. Таким образом, 666 означает rw-rw-rw-. Кроме того, оператор AND сохраняет только биты, которые являются 1 в * обоих * операндах, поэтому код фактически * удаляет * все разрешения, которые * не * читаются/записываются. – Wim

Смежные вопросы