Показать полную графическую версию : синтаксическая структура
Здрасте всем.
Глядел код на php, и нашел вот такое кусочек
if (!$buf = trim($buf)) {
continue;
}
как понять это условие , что делает "!" в начале строки?
! в начале строки - это "не" (отрицание), но конструкция, похоже все равно ошибочна, тк "=" - это опреатор присваивания $a = 5; обозначает, что переменной $a присвоили значения 5, в отличие от выражения "==" используемому при проверке (проверка равенства по значению), или "===" - (по значению и типу)
mar
К сожелению не ошибочная :)
Вот весь код.
#!/usr/local/bin/php -q
<?php
error_reporting(E_ALL);
/* Allow the script to hang around waiting for connections. */
set_time_limit(0);
/* Turn on implicit output flushing so we see what we're getting
* as it comes in. */
ob_implicit_flush();
$address = '192.168.1.53';
$port = 10000;
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() failed: reason: " . socket_strerror($sock) . "\n";
}
if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo "socket_bind() failed: reason: " . socket_strerror($ret) . "\n";
}
if (($ret = socket_listen($sock, 5)) < 0) {
echo "socket_listen() failed: reason: " . socket_strerror($ret) . "\n";
}
do {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
break;
}
/* Send instructions. */
$msg = "\nWelcome to the PHP Test Server. \n" .
"To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
socket_write($msgsock, $msg, strlen($msg));
do {
if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
echo "socket_read() failed: reason: " . socket_strerror($ret) . "\n";
break 2;
}
if (!$buf = trim($buf)) {
continue;
}
if ($buf == 'quit') {
break;
}
if ($buf == 'shutdown') {
socket_close($msgsock);
break 2;
}
$talkback = "PHP: You said '$buf'.\n";
socket_write($msgsock, $talkback, strlen($talkback));
echo "$buf\n";
} while (true);
socket_close($msgsock);
} while (true);
socket_close($sock);
?>
Взято http://ua2.php.net/manual/ru/ref.sockets.php
Как бы перевести ее на русский чтоб понять чтож она делает :)
Underson
17-12-2005, 17:57
if (!$buf = trim($buf)) {
continue;
}
можно понять так ... :clever-ma если не удалось присваивание... переходим на следующюю итерацию :o
если этим самым присвоением мы задаем переменную то сру
vadimiron
17-12-2005, 20:13
if (!$buf = trim($buf)) {
continue;
}
Я думаю это так: сначало надо понять что идёт в начале: присвоение( = ) или отрицание(!)
В мануале, в таблице приоритетов стоит, что ! производится раньше чем =, то есть получается происходит следущее:
сначало берётся отрицание от $buf и потом получившемуся значению присваевается новое значение, а именно trim($buf), что в общем то не имеет большого смысла
НО: в мануале внизу в сноске стоит
Although ! has a higher precedence than =, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the output from foo() is put into $a.Значит !$buf = trim($buf)
надо скорей всего расценивать как !($buf = trim($buf)), то есть сначало обрубаем пустые места буффера с обоих сторон, и если буффер после этого обрубания остаётся нулевым (то есть ничего кроме пустоты там не было), то сервер пропускает данную итерацию и обрабатывает следущее сообщение в очереди
Underson
18-12-2005, 15:39
vadimiron исттину говоришь...
да, vadimiron прав. Так оно и есть. Причем я от греха подальше в таких случаях все-таки использую скобки. Еще одна детать - наличие или отсутствие чего-то по пустоте. Поскольку пустота бывает разная :) (а мануал, как показано выше изменчив =)) имхо спокойней все-таки проверять пустую строку не !, а, скажем
(strlen($str) < 1)
vadimiron
18-12-2005, 16:15
mar
Да они просто в одном if-е сделали две действия: 1) обрубание пустот и 2)проверка - типа круто (правда никому не понятно)
Мне так тоже не нравится, каждая команда должна одно действие выполнять
$buf = trim($buf);
if(strlen($buf) < 1) continue;
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.