Принцип работы function()?

Статус
Закрыто для дальнейших ответов.

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Перечитал кучу литературы по php, сделал на сайте регу, авторизацию, чат, форум, обмен письмами внутри сайта и много ещё всякого... Но никак не пойму, зачем нужны функции эти? Я только понял что в ней пишешь какой то код, потом её вызываешь и она срабатывает... Но я обычно тем же самым путем обхожусь параметром if() или elseif - тоже самое, если исполнится тело, то произойдет работа скрипта... Пробовал делать с функциями - получалось, но на следующий день начинал копаться в коде и вот не нравится мне там что написана эта функция, которая работает как надо, но не нравиится мне функция и переделываю во всё тоже самое что было прежде:(
А функции? Когда их нужно применять? Всегда ли они срабатывают? Или срабатывают только при вызове? Или они работают как то в буфере, а потом выводятся данные из них? Часто такое было, что пишут function blabla() {Тут какая то мне помощь} funct(blabla); И я всегда подтираю эти дела, вобщем убираю... Вобщем, кому не сложно объясните, зачем их применять и когда, буду признателен:)
А уж если есть оочень добрые люди, то можно с примером кодовым на php, типа вот это правильно, с функциями, потому что ,,такие то преимущества,, а вот это не правильно, потому что ,,такие то недостатки,, :rolleyes:
 

Snickers

Быдлокодер
Регистрация
05.11.2010
Сообщения
388
Перечитал кучу литературы по php, сделал на сайте регу, авторизацию, чат, форум, обмен письмами внутри сайта и много ещё всякого... Но никак не пойму, зачем нужны функции эти? Я только понял что в ней пишешь какой то код, потом её вызываешь и она срабатывает... Но я обычно тем же самым путем обхожусь параметром if() или elseif - тоже самое, если исполнится тело, то произойдет работа скрипта... Пробовал делать с функциями - получалось, но на следующий день начинал копаться в коде и вот не нравится мне там что написана эта функция, которая работает как надо, но не нравиится мне функция и переделываю во всё тоже самое что было прежде:(
А функции? Когда их нужно применять? Всегда ли они срабатывают? Или срабатывают только при вызове? Или они работают как то в буфере, а потом выводятся данные из них? Часто такое было, что пишут function blabla() {Тут какая то мне помощь} funct(blabla); И я всегда подтираю эти дела, вобщем убираю... Вобщем, кому не сложно объясните, зачем их применять и когда, буду признателен:)
А уж если есть оочень добрые люди, то можно с примером кодовым на php, типа вот это правильно, с функциями, потому что ,,такие то преимущества,, а вот это не правильно, потому что ,,такие то недостатки,, :rolleyes:
функции для того чтобы по сто раз одно и тоже не писать в коде. а вообще все давно заюзали классы и радуются. смысл в них понимаешь когда создаешь большие проекты, это простота их подключения и работы с ними. в начале тоже не понимал зачем) а как написал свой класс для работы с базой, так все, заразился этими классами)
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
Не против если я встряну в чужую тему?
Snickers, давайка поподробнее про классы. Я слышал, даже пользовался чужими. А вот свои не писал еще. Сам только недавно научился использовать/писать свои функции, а вот до классов не дошел.

Adanos, функции полезны именно для постоянных однообразных задач.
К примеру у тебя пишется что то в файл. При чем постоянно, например у тебя гостевая на файлах.
Так вот, что б постоянно не писать открытие файл, запись и прочее - все это заноситься в функцию, и только этой функции передаем нужные переменные.

Или допустим, у тебя в коде подключается несколько раз инклуд, при чем разных файлов и в разном месте кода.
Вот что бы не плодить десятки файлов, все их можно объединить, сделав каждый файл - функцией.
И подключив один раз файл - объявлять вместо инклуда - функцию.

Это так примеры на вскидку, ради которых я и изучил функции. А примеров на самом деле сотни, на что фантазии хватит.
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Adanos вот смотри яркий пример зачем нужны функции.
У тебя есть скрипт расчета процентов в зависимости от.... ну сложных зависимостей, на пример просят посчитать скидку, смотря на то как давно пользователь пользуется системой, смотря сколько он покупал товаров, смотря сколько ему лет, смотря какого цвета у него кошка бла-бла-бла итд итп.

И тебе нужно высчитывать эту скидку:
1) На всех страницах, справа, что бы показывать пользователю : "Поздравляем, у вас уже 1.53245 % скидки!"
2) На странице расчета сумма заказа.
3) При отправке письма пользователю, нужно информировать его о скидке
4) На страницах с ценами, указывать сколько человек сэкономит со скидкой
Ну и еще много много разных пунктов.
Вот вы написали аццки умную формулу, на 10 строчек.
Понавставляли этот код во все места где надо.
Запустили сайт, все работает все рады.
Но тут внезапно заказчик говорит: "Как же так! Мы забыли! У меня есть собачка Нюся, и я хочу что бы еще всем владельцам маленьких собачек давали дополнительно 0.03% скидки! Это обязательно!"
И что вы будете делать? Будете лезть во все места где написали формулу и её исправлять?
А если использовать функцию
Код:
function getMySuperDiscount(){
 //.....
}
то для того что бы мигом исправить формулу вам придется исправить функцию в одном месте, и вы уж точно нигде не упустите что либо. И может вначале в маленьком проекте вы все помните, но через месяц начнется забываться, и вы обязательно пропустите моменты, где же вы добавляли эту формулу.

Для удобства вообще лучше выносить функции в отдельный файл и подключать этот файл с помощью include. Пусть там хранятся куча функций, ведь объявление функций (function name () {....}) - это еще не значит что она будет выполняться, так что ничего страшного, даже если и они не используются.

BaNru классы замечательны например такими примерами:
Код:
$user = new User();
$user->setGroup('Administrator');
$user->setName('Vania');
$user->save();
Объяснять что значит подобная запись не буду, думаю и так все ясно по названиям. В чем примечательность?
Мы не знаем как хранятся пользователи, в MySQL, в PostrgreSQL или вообще в NOSQL базах, а может в текстовых файлах? Какие у них поля в базе данных, и как они хранят себя. Мы просто используем указанные методы. Пусть мы хранили пользователей в текстовых файлах, но в друг подросли и решили что SQL базы данных это круто, на же не придется менять весь код, нам придется исправить только класс пользователей а внешне работа останется такой же, и в куче сайтов где мы использовали класс User мы просто добавим обновленную версию класса, и все останется работать так же, потому что внешне интерфейс класса остался тот же.
 

tigra60

Спасатель
Регистрация
10.12.2009
Сообщения
1 990
Перечитал кучу литературы
Знакомая фраза, небезызвестный Резун её аффтар.

Вы прочтите здесь раздел "Пользовательские функции в PHP" и дальше по ссылке здесь.

И тогда страшная тайна мальчиша-Кибальчиша вам откроется.

Вообще-то, это тема для школьных уроков информатики.
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
kein, спасибо конечно за попытку разъяснить, но так ни хрена и не понял.
Как подключать классы я в курсе. А как вот писать - не знаю!
 

tigra60

Спасатель
Регистрация
10.12.2009
Сообщения
1 990
Вот отличный справочник, рекомендую в закладки.
 

Snickers

Быдлокодер
Регистрация
05.11.2010
Сообщения
388
Вот отличный справочник, рекомендую в закладки.
по моему в том руководстве очень мало информации собственно по классам и вообще написанное относится к php 4
тот же конструкт не описан.

на том же сайте есть более развернутая и новая статья статья
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
Да, читал я и то и другое.
Но все равно еще не догоняю. Пока на практике не применю в нужном мне месте,я навряд ли пойму.
А что такое объект?

Скажите именно своими словами, а не ссылкой.
 

Snickers

Быдлокодер
Регистрация
05.11.2010
Сообщения
388
Да, читал я и то и другое.
Но все равно еще не догоняю. Пока на практике не применю в нужном мне месте,я навряд ли пойму.
А что такое объект?

Скажите именно своими словами, а не ссылкой.
это коробка-миксер.
в неё ты заталкиваешь ингредиенты

Код:
$korobka->autor_id = $autor_id;
$korobka->receiver_id = $receiver_id;
$korobka->msg_text = $msg_text;
и нажимаем кнопку на коробке
Код:
$korobka->send();
после чего внутри коробки к ранее внесенным данным добавляется дата и прочие дополнительные данные которые должны подставится автоматически
И ингредиенты из коробки удаляются ЛИБО остаются но в придачу мы можем вытащить из неё новые полученые в результате нажатия кнопки
Код:
$status = $korobka->status_send;
switch ($status)
{
    case 'ok':
        echo 'Сообщение отправлено';
    break;
    case 'in_progress':
        echo 'Сообщение отправляется';
    break;
    case 'fail':
        echo 'Сообщение не отправлено, возникла ошибка';
    break;
    case 'NULL':
        echo 'Сообщение не отправлялось';
    break;
}
а потом вытряхнуть все из неё
Код:
$korobka->clean();
и можно использовать заного не инициализируя её снова!
и таких коробок может быть много! и во всех будут свои данные
Код:
$korobka1 = New korobka();
$korobka2 = New korobka();
$korobka3 = New korobka();

или требуется рассказать о том как именно их создавать? то есть раскрыть внутренность, а не простоту в использовании?

тут тоже все предельно просто
создаем класс с названием lib
Код:
class lib {

}
теперь зададим две функции по умолчанию которые автоматически выполняются при инициализации и удалении объекта
Код:
class lib {
    function __construct () {
        echo 'Объект был создан';
    }
    function __destruct () {
        echo 'Объект был уничтожен';
    }    
}
$lib = New lib(); //выдаст - Объект был создан
unset($lib); //выдаст - Объект был уничтожен
теперь зададим приватные переменные доступные только внутри класса и пару функций
[/code]
теперь зададим две функции по умолчанию которые автоматически выполняются при инициализации и удалении объекта
Код:
class lib {
    public $check = 0;
    private $reader = 0;
    function __construct () {
        echo 'Объект был создан';
    }
    public function check_reader ($reader_id) {
        $ath = mysql_query('SELECT `dostup` WHERE `id` = $reader_id;');
        $result = mysql_fetch_array($ath);
        if($result[0]['dostup']==1)
        {
            $this->check = 1;
        }
        else
        {
            $this->check = 0;
        }
    }
    public function get_lib () {
        if($this->check==1)
        {
            $ath = mysql_query('SELECT * WHERE `id` = $reader_id;');
            $result = mysql_fetch_array($ath);
            return $result;
       }
        else
        {
            echo 'У данного пользователя нет доступа к библиотеке';
            return NULL;
        }
    }
    function __destruct () {
        echo 'Объект был уничтожен';
    }    
}
$lib = New lib(); //выдаст - Объект был создан
$lib->reader_check($user_id);//отправит мд на проверку, назад нчиего ен возвращается
$books = $lib->get_lib(); //если до этого проверка была удачной, придет список книг, если нет то будет получен результат NULL, а в браузере выведется сообщение - У данного пользователя нет доступа к библиотеке
echo $lib->reader// ничего не выведет, переменная приватна
echo $lib->check// выведет значение переменной. 1 или 0 в данном случае
unset($lib); //выдаст - Объект был уничтожен
зы. код не тестил, писал прямо тут от балды. если что, извиняюсь за говнокод или ошибки, все это призвано передать смысл классов)
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
О как многое узнал за седня))
Не по теме вопрос можно? Помогите .htacces ; мне дали код, сказали подредактируешь и всё норм будет, а я не пойму как правильно его изменить.. вообще с .htacces не знаком:(
Код:
php_value date.timezone Europe/Moscow
<ifModule mod_headers.c>
<filesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=2592000, public"
</filesMatch>
<filesMatch "\.(css|js)$">
Header set Cache-Control "max-age=604800, public"
</filesMatch>
<filesMatch "\.(xml|txt)$">
Header set Cache-Control "max-age=172800, public, must-revalidate"
<filesMatch "\.(html|htm|php)$">
Header set Cache-Control "max-age=3600, private, must-revalidate"
</filesMatch>
</ifModule>
<ifModule mod_headers.c>
Header unset Last-Modified
</ifModule>
<ifModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 3600 seconds"
ExpiresByType text/html "access plus 3600 seconds"
ExpiresByType image/gif "access plus 2592000 seconds"
ExpiresByType image/jpeg "access plus 2592000 seconds"
ExpiresByType image/png "access plus 2592000 seconds"
ExpiresByType text/css "access plus 604800 seconds"
ExpiresByType text/javascript "access plus 604800 seconds"
ExpiresByType application/x-javascript "access plus 604800 seconds"
</ifModule>
<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE application/javascript
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/html
  <IfModule mod_setenvif.c>
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
  </IfModule>
</IfModule>
<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>
AddDefaultCharset windows-1251
Страницы для телефонов, мне нужно что бы сжимало страницу, затем обрабатывало страницу(php,css,html) а потом помещалось это как то в буфер и после полной обработки выводило всю страницу без её догрузки... Пишу пример: Допустим нажимаем ссылку, совершается переход, сперва вылезает весь текст на белом фоне, потом появляется цвет, потом ещё чет браузер догружает там, не пойми че... вот надо сделать что бы пока всё не загрузит - не открывалась страница...
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
Snickers, спасибо!
Весь код пока не вкурил. Но многие вопросы уже отпадают потихоньку. Думаю благодаря твоему примеру скоро начну юзать классы.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Люди, почему не работает функция? В столбце бд хранится текст, его надо вывести и определенные выражения вывести как смайлы. вот например:
Код:
function smile(){
$bbb=array(
'.pivo.' => '<img src="smiles/pivo.gif">',
'.пиво.' => '<img src="smiles/pivo.gif">',
'.angel.' => '<img src="smiles/angel.gif">',
'.ангел.' => '<img src="smiles/angel.gif">',
//и т.д
);
$mess = strtr($arr, $bbb);
return $mess;
}
//Запрос к бд, обработка и т.д 
//выводим
while($_cikl = mysql_fetch_array($zapros)){
$arr=$_cikl['text'];
smile();
echo $mess;
}
 

tigra60

Спасатель
Регистрация
10.12.2009
Сообщения
1 990
Про область видимости вы, наверное, "ниасилили"?

$arr внутри функции и вне её - это совершенно разные переменные!

Попробуйте так:
Код:
function smile($arr){
$bbb=array(
'.pivo.' => '<img src="smiles/pivo.gif">',
'.пиво.' => '<img src="smiles/pivo.gif">',
'.angel.' => '<img src="smiles/angel.gif">',
'.ангел.' => '<img src="smiles/angel.gif">',
//и т.д
);
$mess = strtr($arr, $bbb);
return $mess;
}
//Запрос к бд, обработка и т.д 
//выводим
while($_cikl = mysql_fetch_array($zapros)){
$arr=$_cikl['text'];
$mess = smile($arr);
echo $mess;
}
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Про область видимости вы, наверное, "ниасилили"?

$arr внутри функции и вне её - это совершенно разные переменные!

Попробуйте так:
Код:
function smile($arr){
$bbb=array(
'.pivo.' => '<img src="smiles/pivo.gif">',
'.пиво.' => '<img src="smiles/pivo.gif">',
'.angel.' => '<img src="smiles/angel.gif">',
'.ангел.' => '<img src="smiles/angel.gif">',
//и т.д
);
$mess = strtr($arr, $bbb);
return $mess;
}
//Запрос к бд, обработка и т.д 
//выводим
while($_cikl = mysql_fetch_array($zapros)){
$arr=$_cikl['text'];
$mess = smile($arr);
echo $mess;
}
Спасибо, работает! Теперь буду "осиливать"
А можно как-то сделать что бы ограничить число выводимых смайлов в СТРОКЕ? Например что бы в одной строке выводилось максимум 5 смайлов, а остальные выводились как обычный текст?
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Почему не работает?
Код:
$_text1 = trim(substr($_POST['text1'],0,20));
$_text = trim(substr($_POST ['text'],0,400));
function obr ($_text,$_text1){
$_text1=preg_replace("/[^a-zA-Z0-9]/",'',$_text1);
$_text=preg_replace("/[^а-яА-Яa-zA-Z0-9\s]/",'',$_text);
return $_text; return $_text1;
}
obr($_text,$_text1);
//Далее заносим результат в бд
Ну что не правильно я делаю? Переменные объявлены, в область видимости их запихал, результат возвратил... А всё равно не обрабатывается:(
 

Snickers

Быдлокодер
Регистрация
05.11.2010
Сообщения
388
раз уж пошла такая пляска
Код:
$_text1 = trim(substr($_POST['text1'],0,20));
$_text = trim(substr($_POST ['text'],0,400));
function obr ($_text,$_text1){
$_text1=preg_replace("/[^a-zA-Z0-9]/",'',$_text1);
$_text=preg_replace("/[^а-яА-Яa-zA-Z0-9\s]/",'',$_text);
}
obr(&$_text,&$_text1);
//Далее заносим результат в бд
 

Ice Soul

Member
Регистрация
17.04.2011
Сообщения
12
Snickers, спасибо!
Весь код пока не вкурил. Но многие вопросы уже отпадают потихоньку. Думаю благодаря твоему примеру скоро начну юзать классы.
Не надо этого делать.

гугл -> ООП -> красные глаза->прошло 1 - 2 месяца и newbie developer . Вот уже потом начинай ...

А пример этот ООП ради ООП и реальной пользы он не показывает.

Функции в первую очередь это рефракторинг. Иногда они могут полностью заменить ООП (Друпал).


Код:
function plural($n, $forms)
{
    return $n % 10 == 1 && $n % 100 != 11 ? $forms[0] : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? $forms[1] : $forms[2]);
}

$vasyaFingers=rand(1,100);
$vanyaFingers=rand(1,100);
echo 'У Васи '.$vasyaFingers.' '.plural($vasyaFingers,array('палец','пальца','пальцев')).'<br/>';
echo 'У Вани '.$vanyaFingers.' '.plural($vanyaFingers,array('палец','пальца','пальцев')).'<br/>';
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Ice Soul у меня такое чувство что вы еще не сталкивались с реальными задачами.
Вот к примеру вам моя задача с работы.
Организовать скрипт который сам себя форкает, и выполняет в дочерних процессах задачу, в момент времени может быть запущенно лимитированное кол-во потомков. Будет использовать в разных задачах.
Вот скрипт, где он используется:
Код:
$process = process::instance(30 ); // 30 потомков
while($process->fork() && $process->is_master()){ /*Тут некие работы по завершению всех задач*/ }
// тут идет задача которая будет выполнятся в несколько потоков
if($is_done) $process->getMaster()->terminate(); // $is_done выполнена ли вся работа, в данном случае специфика такова что именно потомки осведомлены о завершении всех работ
Этот класс очень легко использовать, сам он может принять сигналы о завершении, и убить дочерние процессы, ждет завершения дочерних процессов, когда кол-во превышает лимит, что бы запустить очередной форк, когда освободится очередь.
Заметьте всего 3 строчки кода во внешнем файле, и уже все работает.
А как вы это представляете будет выглядеть на функциях?
 

Ice Soul

Member
Регистрация
17.04.2011
Сообщения
12
Вы меня наверное не поняли...я не осуждал ООП подход.
Я осуждал пример тов. Snickers,который ну никоим образом не отражает суть ООП,а показывает,то что оказывается функции можно затолкать в "особый класс" и "объявить переменную" с областью видимости для этих двух функций.

Что касается вашего примера,то все красиво и ,наверно,разумно (3 строчки таки),но это можно сделать на функциях.По крайней мере в 5.3.
 
Статус
Закрыто для дальнейших ответов.
Верх Низ