Войти

Показать полную графическую версию : синтаксическая структура


lcat
17-12-2005, 11:53
Здрасте всем.
Глядел код на php, и нашел вот такое кусочек

if (!$buf = trim($buf)) {
continue;
}
как понять это условие , что делает "!" в начале строки?

mar
17-12-2005, 13:14
! в начале строки - это "не" (отрицание), но конструкция, похоже все равно ошибочна, тк "=" - это опреатор присваивания $a = 5; обозначает, что переменной $a присвоили значения 5, в отличие от выражения "==" используемому при проверке (проверка равенства по значению), или "===" - (по значению и типу)

lcat
17-12-2005, 17:01
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

E-mail
17-12-2005, 19:57
если этим самым присвоением мы задаем переменную то сру

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 исттину говоришь...

lcat
18-12-2005, 15:45
vadimiron
спасибо

mar
18-12-2005, 16:04
да, 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