Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: что значит запятая в if else
 
 автор: kvins   (07.03.2011 в 23:56)   письмо автору
 
 

читал мануал и не понял как работает запятая в этой проверке

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))


кстати как вообще это называется когда ставятся всякие закарючки ">"::"+"==" и т д

  Ответить  
 
 автор: cheops   (08.03.2011 в 00:09)   письмо автору
 
   для: kvins   (07.03.2011 в 23:56)
 

Эта запятая относится не к оператору if, а к функции move_uploaded_file(), которая принимает два параметра - запятая нужна для их разделения. Мы помещаем следующий вызов функции
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)

в оператор if
if(...)

  Ответить  
 
 автор: kvins   (08.03.2011 в 00:27)   письмо автору
 
   для: cheops   (08.03.2011 в 00:09)
 

а ну теперь понятно спс =)
получается он присваивает прямо в if проверке, это нормально ?


$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "Файл корректен и был успешно загружен.\n";

  Ответить  
 
 автор: cheops   (08.03.2011 в 00:35)   письмо автору
 
   для: kvins   (08.03.2011 в 00:27)
 

>а ну теперь понятно спс =)
>получается он присваивает прямо в if проверке, это нормально ?
Да, нормально, это довольно распространенный синтаксис в C-подобных языках программирования.

  Ответить  
 
 автор: sim5   (08.03.2011 в 03:36)   письмо автору
 
   для: kvins   (08.03.2011 в 00:27)
 

В выше приведенной проверке ничего никому не присвается, а возвращается результат проверки в виде булевого значения. Хотя присвоить, как вы говорите прямо в проверке, можно:
<?
$k 
5;
$n 3;
if(
$m $k $n) echo $m;

  Ответить  
 
 автор: kvins   (08.03.2011 в 10:33)   письмо автору
 
   для: sim5   (08.03.2011 в 03:36)
 

а это не 1 и тоже ?
move_uploaded_file появляется только внутри if получается что там он как вы говорите
а возвращается результат проверки в виде булевого значения. просто вы название поменяли а смысл тот же вроде, или я чета неправильно понял ?

этот код из мануала
Пример #2 Проверка загружаемых на сервер файлов
http://ru.php.net/manual/ru/features.file-upload.post-method.php
значит там не все написали и надо еще директория прописать куда сохранять?
если да то странно почему этого не написали

  Ответить  
 
 автор: sim5   (08.03.2011 в 11:05)   письмо автору
 
   для: kvins   (08.03.2011 в 10:33)
 

Нет не одно и тоже - присвоение значения чему либо, и возвращаемое значение результата сравнения (операции).

  Ответить  
 
 автор: cheops   (08.03.2011 в 11:25)   письмо автору
 
   для: sim5   (08.03.2011 в 11:05)
 

Для оператора if одно и тоже, и то и другое возвращает значение, которое можно привести к логическому типу (если = присваивает 0, будет false, если что-то отличное от 0, будет true).

  Ответить  
 
 автор: sim5   (08.03.2011 в 11:31)   письмо автору
 
   для: cheops   (08.03.2011 в 11:25)
 

Операции проверки возвращают значение того флага, которое мы попросим. При этом сам результат операции не возвращается, так как мы об этом не просим и иприсваивать нечего. Другое дело если попросить об этом:
if(5 - 3) echo '1'; //возвращено состояние флага zero
if($m = 5 - 3) echo $m; //возвращено 2 как результат операции, затем состояние флага zero, как результат проверки результата операции.

  Ответить  
 
 автор: cheops   (08.03.2011 в 12:10)   письмо автору
 
   для: sim5   (08.03.2011 в 11:31)
 

>При этом сам результат операции не возвращается
Результат операции возвращают всегда - на этом построены C-подобные языки. Да помоему и языков, которые работают по другому уже не осталось, так как почти все современные языки на C/C++ пишутся.

>if(5 - 3) echo '1'; //возвращено состояние флага zero
>if($m = 5 - 3) echo $m; //возвращено 2 как результат операции, затем состояние флага zero,
>как результат проверки результата операции.
Не понятно о каком состоянии флага zero, тут речь (первая строка возвращает - 1, вторая - 2)? Оба оператора и = и - вернут значения своей работы, которые будут приведены к логическому типу (в данном случае true). Это же операторы C++ изначально - они всегда возвращают результат своих действий, более того, логика их работы выглядит следующим образом
operator-(5, 3)
operator=($m, operator-(5, 3))

Если они значений возвращать не будут - вся арифметика в языке работать перестанет. Это лишь форма записи, а работает она лишь по тому, что перегруженные функции возвращают значения, которые могут передавать друг другу по цепочке - от одной функции operator другой.

  Ответить  
 
 автор: sim5   (08.03.2011 в 14:26)   письмо автору
 
   для: cheops   (08.03.2011 в 12:10)
 

Результат результату рознь )
Если в первом случае возвращается флаг результата операции (флаг флагового регистра zero, который всегда будет устнаваливаться/сбрасываться при вычитании, сравнении), то во втором рузультат аккумулятора, а затем флаг проверки результата вычитания.
В первом случае возвращаемое значение просто смысла нет присваивать, хотя возможно и потребуется для логики, во втором мы имеем и результат присвоенный переменной и логику.

  Ответить  
 
 автор: kvins   (08.03.2011 в 14:36)   письмо автору
 
   для: sim5   (08.03.2011 в 14:26)
 

как все сложно , я понял вы меня запутать решили =))

  Ответить  
 
 автор: sim5   (08.03.2011 в 15:01)   письмо автору
 
   для: kvins   (08.03.2011 в 14:36)
 

Да что тут путаться, и сложного нет ничего. ) РНР оперирует регистрами процессора, а не сам по себе, и в конечном итоге ваш скрипт будет выполняться командами процессора, его возможностями, а не выдумывать нечто. Во всех операциях проверки вам будет возвращаться одно из двух значений true/false (1/0), тоже самое и при выполнении функций.

  Ответить  
 
 автор: cheops   (08.03.2011 в 14:54)   письмо автору
 
   для: sim5   (08.03.2011 в 14:26)
 

Да нет такого. Есть две функции
operator-(5, 3) 
operator=($m, operator-(5, 3))

которые эквиваленты
5 - 3
$m = 5 - 3

и возвращают они одно и то же - числа, эти числа берутся и приводятся к логическому типу. Если вы выполните следующий код, вы в этом сами убедитесь
<?php
  
echo $m 3// 2
  
echo "<br />";
  echo 
3// 2
?>

>флаг флагового регистра zero, который всегда будет устнаваливаться/сбрасываться при
>вычитании, сравнении), то во втором рузультат аккумулятора
В процессор давайте лезть не будем, там до процессора еще компилятор C++ и интерпретатор PHP, если еще у первого базовые типы не являются объектами, то у второго уж они точно ими являются и их классы перегружают операторы - и = и оба эти оператора возвращают точно такой же объект PHP-переменной, как и любая другая функция PHP будь она встроена или определена пользователем. И эта PHP-переменная в контексте оператора if возвращает 0 или 1, в которые PHP перемалывает любую PHP-переменную.

  Ответить  
 
 автор: sim5   (08.03.2011 в 15:02)   письмо автору
 
   для: cheops   (08.03.2011 в 14:54)
 

Ну да, если выполнять этот пример, кто же спорит, но в нет условия. )

  Ответить  
 
 автор: kvins   (08.03.2011 в 15:18)   письмо автору
 
   для: sim5   (08.03.2011 в 15:02)
 

кароче лучше так не делать и все =) легко можно и без этого обойтись

  Ответить  
 
 автор: sim5   (08.03.2011 в 15:49)   письмо автору
 
   для: kvins   (08.03.2011 в 15:18)
 

Ну это как посмотреть. Например, перед вами стоит задача сравниения последовательностей чисел вычитанием, и запоминания результата сравнения в виде бинарного набора, но только в том случае, если результатом сравнения будет истина.
Так как результат проверки if(A-B) будет использован интерпретатором для ветвления в вашем коде, а вы в явном виде его не получаете, то вы будете вынуждены писать, например, так:
<?
if($a-$b$bin $a-$b;
И только после этого уже использовать значение переменной $bin как результат сравнения. А можно поступить иначе, присваивать возвращаемый результат, то есть сохранять его:
<?
$a 
= array(5,3,7,2,6);
$b = array(4,3,4,1,6);
$bin 0;
for(
$i=0$i<count($a); $i++) {
  if(
$ret $a[$i]-$b[$i]) { //присваиваем (сохраняем) результат проверки, то есть сохраняем его прямо в условии
    
$bin <<= 1;
    
$bin |= $ret;
  }
}
echo 
decbin($bin);
Во втором случае интерпертатор сперва вычтет числа, присвоит результат вычитания переменной $ret, и только лишь затем проверит ваше условие - равна ли $ret истине. Если добавить вывод этого результата, то вы увидите, что будут возвращены 1,3,1.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования