Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Функция с вложенными функциями. Возможно?
цитата
12/05/12 в 19:17
 Lexikon
Написал код1, в этом коде есть пару самописных функций.
Теперь хочу этот код1 сделать функцией вынести это в отдельный файл и прикрутить к другому коду2.
Возможно ли такое? Просто смущает то что написанная функция будет содержать в себе еще функции.

Последний раз редактировалось: Lexikon (14/05/12 в 12:29), всего редактировалось 1 раз
цитата
12/05/12 в 19:39
 ibiz
такое возможно
но лучше сделать класс
цитата
12/05/12 в 20:12
 Ailk
ага, изучай ООП. Оч удобно!
цитата
12/05/12 в 20:22
 FTS
Да icon_cool.gif
цитата
13/05/12 в 11:00
 freeek
конечно это будет смущать, эти функции то попадут в глобальную область видимости.
т.е. тут вариант, что эти функции будут дальше существовать сами по себе.

можно использовать статический метод класса.
но если рассматривать это в рамках ооп, получается сложнее. это наверное похоже чем то "фасад", объединяем некий функционал, по один интерфейс.
цитата
13/05/12 в 21:45
 Lexikon
smail54.gif
всем спасибо.
буду пробовать icon_wink.gif
цитата
14/05/12 в 15:51
 Lexikon
с классами так что то и не получилось разобраться, вернее сложилось такое впечатление что применения класса тут неумесно, хотя х.з., может ошибаюсь.
Есть у меня файл с готовым рабочим кодом, но тут решил усовршенствовать, отдельно написал код этого усовершенства и сделал это как собственной функцией в которой есть еще пару функцияй т.е. выглядет это примерно так:

Файл: function.php


function UNIQ($subject){

     function random($filename) {
     ...
     }
     function string_sort($a, $b){
     ...
     }

...

}

если я создаю файл result.php с кодом:


<?php

require_once("function.php");

$subject = "тут текст для обработки";

echo UNIQ($subject);

?>

в этом случае все работает нормально.
НО, как только я подключаю function.php в index.php

с таким содержанием:


function getLimitText($text, $limit) {   
...
}

require_once("function.php");

... остальной код ...


выдается такая вот ошибка:

Fatal error: Cannot redeclare random() (previously declared in function.php)

невозможно переопределить что то в функции random()
как только я убераю функциию random() начинает ругаться на следующую icon_confused.gif т.е. на string_sort()

Х.з. отдельно работает, а в связке нет. icon_confused.gif
цитата
14/05/12 в 16:09
 ibiz
Код:
function UNIQ($subject){

      function random($filename) {
      ...
      }
      function string_sort($a, $b){
      ...
      }

...

}


прикол trollface.png

по идее надо делать так:
Код:
function UNIQ($subject){
random($filename);
string_sort($a, $b);
}
function random($filename) {
...
}
function string_sort($a, $b){
...
}


но я бы настоятельно рекомендовал попробовать изучить классы smail54.gif
цитата
14/05/12 в 17:52
 Ailk
создаешь файл my_class.php
Содержание my_class.php

<?php
class My_Class
{
   public $filename; // задаем имя файла, как хошь, по умолчанию будет му_филенаме.екст
   public $subject // сабж твой
   
   public function __construct ($filename = "") // конструктор класса, тут при вызове класса задаются параметры сразу. в общем если нет имя файла, то будет такой
   {
      if (!$filename || empty($filename))
         $filename = "my_filename.ext";
   }
   
   // функция уник. вызываешь сабж тут вот этой переменной $this->subject и работаешь с ней
   public function UNIQ ()
   {
      $this->random();
      //...
      $this->string_sort($a, $b);
      //...
                return $resultat;
   }
   
   public function random ()
   {
      // file($this->filename); вот так примерно вызываешь файл свой, или как оно у тебя устроено...
   }
   
   public function string_sort ($a, $b) // я бы порекомендовал использовать встроенную функцию sort() или более подходящую из числа функций сортировки массивов.
   {
      ...
   }
   
   public function displayResult() // ну тут вывод результатов, можно снабдить хтмл тегами. чтобы не мешать логику и вывод
   {
      echo $this->UNIQ();
   }
}
?>


в индексе работаешь так:

<?php
include_once ("my_class.php");
$class = new My_Class (); // создаем экземпляр нашего класса
$class->subject = "тут мой сабж типо"; // задаем сабж
$class->displayResult(); // и выводим
цитата
14/05/12 в 18:43
 Lexikon
касаемо:
Цитата:
public function string_sort ($a, $b) // я бы порекомендовал использовать встроенную функцию sort() или более подходящую из числа функций сортировки массивов.

там написана функция сортировки массива по количиству символов в строках.
так что вроде продругому не получится.
А так буду разбираться в классах, постараюсь собрать всё в бошке icon_wink.gif
Благодарю за помощь.
цитата
15/05/12 в 09:21
 Lexikon
походу я туповат icon_confused.gif


<?php

//----------- Функция сортировки Массива ------------
function string_sort($a, $b){
        if              ( strlen ($a) < strlen($b) )
      {
      return 1;
      }
      elseif           ( strlen ($a) == strlen($b) )
      {
      return 0;
      }
      else
      {
      return -1;
      }
}
//---------------------------------------------------


// Текст для обработки
$subject = "A blonde girl is playing a tambourine when a guy outside throws a snowball against her window. She puts on a coat and goes outdoors for a snow fight with the guy. When she is laying on the ground he bares her tits and puts his cold hands on them. Finally, they go indoors for a fuck.";

// Директория с файлами синонимов.
$syn_dir = "synonyms";


// Читаем содержимое файла в массив
$pattern = file("keys.dat");

// Сортируем массив по убыванию длин строк.
usort($pattern, 'string_sort');

// Определяем кол-во элеменов массива.
$cnt_pattern = count($pattern);

// Запускаем цикл прохода по тексту.
for ($z = 0; $z < $cnt_pattern; $z++) {

// Получаем путь к файлу с текстом замены.
$replacement = str_replace(" ", "-", "./".$syn_dir."/".trim($pattern[$z]).".txt");
// Получаем рандомный кей для замены
$lines = file($replacement);
$replacement =  $lines[array_rand($lines)];
// Присваиваем переменной значение слова поиска и удаляем возможные пробелы по краям.
$pattern_i = trim($pattern[$z]);


// С помощью регулярки проходим по тексту с целью поиска разно-регистровых слов
// и заменяем согласно регитру.
$subject = preg_replace("#\b$pattern_i\b#", $replacement, $subject);
$pattern_i                            = ucfirst($pattern_i);
$replacement                         = ucfirst($replacement);
$subject = preg_replace("#\b$pattern_i\b#", $replacement, $subject);
$pattern_i                            = strtoupper($pattern_i);
$replacement                         = strtoupper($replacement);
$subject = preg_replace("#\b$pattern_i\b#", $replacement, $subject);
}

// Удаляем лишнии символы пробелов.
$subject = preg_replace("#(\s+)#", " ", $subject);
$subject = str_replace(" .", ".", $subject);

// Результат.
echo $subject;

?>


это я написал код синонимайзера, но вот теперь мучаюсь с ним немогу его прикрутить к другому коду. чтоб отдавать $subject; с исходным текстом и на выходе получить $subject; уже обработанный icon_sad.gif
цитата
15/05/12 в 09:46
 AWD
дык заверни все это дело в функцию и все.
Код:

function synonymize($subject) {
// Директория с файлами синонимов.
$syn_dir = "synonyms";
...........
// Результат.
// echo $subject;
// Вместо вывода echo возвращаем return сабж
return $subject;
}
ну и дальше вызывай echo synonymize("text for synonymize");
или
$subject = "text for synonymize";
$my_synonym[] = synonymize($subject);
как-то так. icon_rolleyes.gif


Эта страница в полной версии