Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   синтаксическая структура (http://forum.oszone.net/showthread.php?t=58191)

lcat 17-12-2005 11:53 384034

синтаксическая структура
 
Здрасте всем.
Глядел код на php, и нашел вот такое кусочек
Код:

        if (!$buf = trim($buf)) {
            continue;
        }

как понять это условие , что делает "!" в начале строки?

mar 17-12-2005 13:14 384060

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

lcat 17-12-2005 17:01 384135

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 384153

if (!$buf = trim($buf)) {
continue;
}

можно понять так ... :clever-ma если не удалось присваивание... переходим на следующюю итерацию :o

E-mail 17-12-2005 19:57 384178

если этим самым присвоением мы задаем переменную то сру

vadimiron 17-12-2005 20:13 384188

Цитата:

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 384355

vadimiron исттину говоришь...

lcat 18-12-2005 15:45 384359

vadimiron
спасибо

mar 18-12-2005 16:04 384365

да, vadimiron прав. Так оно и есть. Причем я от греха подальше в таких случаях все-таки использую скобки. Еще одна детать - наличие или отсутствие чего-то по пустоте. Поскольку пустота бывает разная :) (а мануал, как показано выше изменчив =)) имхо спокойней все-таки проверять пустую строку не !, а, скажем
PHP код:

(strlen($str) < 1


vadimiron 18-12-2005 16:15 384369

mar
Да они просто в одном if-е сделали две действия: 1) обрубание пустот и 2)проверка - типа круто (правда никому не понятно)
Мне так тоже не нравится, каждая команда должна одно действие выполнять
PHP код:

$buf trim($buf);
if(
strlen($buf) < 1) continue; 



Время: 08:24.

Время: 08:24.
© OSzone.net 2001-