о старом или include и функции

ibear

Guest
о старом или include и функции

Здравствуйте, уважаемые любители и профессионалы php. У меня такой вопрос. Как в некоторый php-крипт включить два php-скрипта, в которых используются функции с одинаковыми именами (бывает и такое :( )? Суть в том, что при включении (include, require, virtual) второго скрипта естественно возникает ошибка о невозможности переопределения функции.

Хотелось бы включения по принципу SSI <!--#include virtual ...>, т.е. включать не сам скрипт, а результат его выполнения (сгенерированный html-текст) без оглядки на использованные функции.

P.S. За такой ламерский вопрос прошу сильно не бить. С правилами форума знаком, поэтому пользовался и поиском и FAQ. Ответов о включениях много, но нужного не нашел, если не прав, то пните :).
 

Screjet

Новичок
Хотелось бы включения по принципу SSI <!--#include virtual ...>, т.е. включать не сам скрипт, а результат его выполнения (сгенерированный html-текст) без оглядки на использованные функции.
PHP:
<? include('http://localhost/super-puper.php'); ?>
 

ibear

Guest
Originally posted by Diesel
Почему бы не переименовать функцию?
Переименовать, конечно, можно, я так и делаю :), но бывает когда это не удобно. Есть, допустим, страничка, которая содержит блок новостей, список последних статей, событий и т.д. Каждый блок - это отдельный скрипт. Все данные хранятся в БД. Для получения их используются функции, например, с именем getrecords. Хотя принцип работы этих функций одинаков, и казалось бы можно реализовать с помощью одной функции, но иногда удобней чтобы функции были разными, так, как они могут различаться нюансами.

Т.е. хотелось бы получить модульность. Каждый модуль (читай, скрипт) самодостаточен и не связан с другими. Эти скрипты могут содержать свои функции и переменные, имена которых в разных скриптах могут совпадать. Т.е. хотелось бы всталять именно результат выполнения скриптов, а не сами скрипты.

-~{}~ 15.09.04 17:12:

Originally posted by Screjet
PHP:
<? include('http://localhost/super-puper.php'); ?>
Про include я знаю (куда без него :) ). Но это не то, т.к. вставляется сам скрипт, а надо только результат.

Может, есть какие-то другие идеи? И не могли бы Вы подсказать, как лучше всего на php создавать модульные системы, и какие для этого средства использовать?
 

_RVK_

Новичок
ibear
Про модульность это большая тема, и это не только инклюды, функции и классы...

Совет Screjet'а будет работать так как ты хочешь, ты как раз и получешь результат, но к твоей задаче это не имеет отношения, не делай так!.

Вообще, если у тебя возникают такие проблемы как ты описал, то ты что-то делаешь неправильно. Вот у меня таких проблем не возникает. Почему?

-~{}~ 15.09.04 18:02:

Зачем тебе в одном скрипте функции с одинаковыми именами, делающие одно и то же, но немножко подругому?
 

Popoff

popoff.donetsk.ua
Есть, допустим, страничка, которая содержит блок новостей, список последних статей, событий и т.д. Каждый блок - это отдельный скрипт. Все данные хранятся в БД. Для получения их используются функции, например, с именем getrecords. Хотя принцип работы этих функций одинаков, и казалось бы можно реализовать с помощью одной функции, но иногда удобней чтобы функции были разными, так, как они могут различаться нюансами.
PHP:
function get_record_news() {...}
function get_record_forum() {...}
function get_record_chat() {...}
function get_record($where) {
  switch($where)
  {
    case 'news': return get_record_news();
    case 'forum': return get_record_forum();
    case 'chat': return get_record_chat();
    default: trigger_error('Invalid $where: "'.$where.'"');
  }
}
 

_RVK_

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

che

Guest
Originally posted by Popoff
edited by che

PHP:
function get_record_news() {...}
function get_record_forum() {...}
function get_record_chat() {...}
function get_record($where=default_value) {
$name='get_record_'.$where;
return $name();
}
А то как то тяжеловато...
 

Popoff

popoff.donetsk.ua
Автор оригинала: Diesel
Popoff
Вопрос не в том как запихнуть все в один файл, а в том что бы понять, что так делать ненужно.
Я думаю, что вопрос, на самом деле, не в том, "как делать не нужно?", а в том, "как делать нужно?" :) Для того, что бы написать хороший красивый короткий код, нужно обладать некоторым опытом. Очевидно, начинающие программисты не обладают таким опытом. Поэтому начинающие программисты пишут плохо, нечитаемо и очень длинно, отчего сами себя еще сильнее запутывают. Я могу только предположить, что ibear хотел сделать функции с одинаковыми именами для того, что бы в точке вызова не было различий (хотя на самом деле, скорее всего, даже ibear не знает для чего :)). И я дал пример, который в общем-то позволяет этого достичь: значение для аргумента $where можно формировать заранее. Хотя, очевидно, есть много других, возможно даже, более оптимальных способов. Я всего лишь дал первый пришедший мне в голову пример, который может подсказать ibear один из возможных вариантов решения его задачи. :)

-~{}~ 15.09.04 19:31:

А то как то тяжеловато...
Это, конечно, более легкий с точки зрения выполнения вариант, но тут, думаю, будет интересно подумать над тем, что бы такое неправильное передать в $where, что бы получить сообщение, отличное от "Функция не существует" :) Может, стоит хотя бы добавить проверку на существование функции? А если вдруг в проекте появится другая фукнция, которая тоже начинается на "get_record_", но не должна вызываться отюда?
 

che

Guest
Originally posted by Popoff
Это, конечно, более легкий с точки зрения выполнения вариант, но тут, думаю, будет интересно подумать над тем, что бы такое неправильное передать в $where, что бы получить сообщение, отличное от "Функция не существует" :) Может, стоит хотя бы добавить проверку на существование функции? А если вдруг в проекте появится другая фукнция, которая тоже начинается на "get_record_", но не должна вызываться отюда?
Лучше бы обратил внимание на кривой ретурн :D
function get_record($where) {
$name=function_exists ('get_record_'.$where) ? 'get_record_'.$where : $default_function;
$val=$name();
return $val;
}
А которые не должны можно в массив... В общем я только способ показал, так же как и ты. А чего там проверять - это наверно пусть тот думает, кто себе приспособит.
 

ibear

Guest
Спасибо всем кто откликнулся. Советы ясны и приняты к сведению.

Originally posted by nikish
ibear
используй объектную модель php - классы
Про классы я тоже думал, видимо придется так и делать.

Originally posted by Diesel
ibear
Про модульность это большая тема, и это не только инклюды, функции и классы...

Совет Screjet'а будет работать так как ты хочешь, ты как раз и получешь результат, но к твоей задаче это не имеет отношения, не делай так!.

Вообще, если у тебя возникают такие проблемы как ты описал, то ты что-то делаешь неправильно. Вот у меня таких проблем не возникает. Почему?

-~{}~ 15.09.04 18:02:

Зачем тебе в одном скрипте функции с одинаковыми именами, делающие одно и то же, но немножко подругому?
Я понимаю как работает include, он действительно возвращает некоторый результат, но приэтом тот скрипт, который вставляется, обрабатывается тем же процессом что и скрипт куда вставляется (или я не прав :confused: ). Virtual для php-скриптов работает аналогично (или я опять не прав :confused: ).

Может я действительно делаю что-то не так, буду думать как сделать правильно. Если Вас не затруднит, то подскажите в какую сторону копать.

Функции с одинаковыми именами на самом деле в разных скриптах. Эти скрипты можно рассматривать как заготовки (кирпичики, модули), которые вставляются в какой-либо главный скрипт.

Originally posted by Johannes
Паттерн MVC тебе поможет.
Шаблоны мне как-то не очень нравятся, так как для их разбора требуются дополнительные затраты, но посмотреть имеет смысл.

Originally posted by Popoff
PHP:
function get_record_news() {...}
function get_record_forum() {...}
function get_record_chat() {...}
function get_record($where) {
  switch($where)
  {
    case 'news': return get_record_news();
    case 'forum': return get_record_forum();
    case 'chat': return get_record_chat();
    default: trigger_error('Invalid $where: "'.$where.'"');
  }
}
Над таким вариантом тоже думал, и тоже пришел к коду как у che.

Относительно того, что очевидно, есть много других, возможно даже, более оптимальных способов, то не могли бы Вы их привести. Я не прошу готовых решений, но хотелось бы получить ряд примеров, чтобы набраться опыта :) .
 

jonjonson

Guest
Чисто теоретически можно выполнить отдельно внешний скрипт, перехватив его выходной поток данных, и вывести данные в своем скрипте. Но по моему это всего-лишь временное решение (нужно заставить работать сейчас и срочно).

А так нагляднее отписывать нечто такое:
PHP:
<?php

class News
{
    var $mId = 0;
    var $mAddDate = '0000-00-00 00:00:00';
    var $mAuthorName = 'неизвестен';
    var $mAuthorId = 0;
    var $mSubject = '';
    var $mText ='';
    var $mIsHiden = false;

    function Add ($authorId, $subject, $text)
    {
        //...
    }

    function Hide ($id)
    {
        //...
    }

    function Show ($id)
    {
        //...
    }

    function Update ($id, $subject, $text)
    {
        //...
    }

    function DelById ($id)
    {
        //...
    }

    function DelByAthorId ($authorId)
    {
        //...
    }

    function DelByAthorName ($authorName)
    {
        //...
    }
}

class NewsList
{
    var $mNewsCount;
    var $mList;

    var $mError = false;
    var $mErrorMessage = '';
    
    function GetNumberOfNews()
    {
        //...
    }

    function GetLimitList ($start, $number)
    {
        //...
    }

    function GetFromDateToDate ($fromDate, $toDate)
    {
        //...
    }

    function GetByAuthorId ($authorId)
    {
        //...
    }

    function GetByAuthorName ($authorName)
    {
        //...
    }
}

$my_news = &new NewsList ();
$total_news_number = $my_news->GetNumberOfNews();
if ($my_news->mError)
{
    print 'Сервис временно не доступен...';
    MyLogingAndEmail ($my_news->mErrorMessage);
} else
{
    if (!$total_news_number)
    {
        print 'Новостей на сегодня нет...';
    } else
    {
        //Код для разбиения на страници...
        $my_news->GetLimitList ($start, $number);
        foreach ($my_news->mList as $news)
        {
            print 'Опубликовано: ' . $news->mAddDate . '<BR />';
            print 'Автор: ' . $news->mAuthorName . '<BR />';
            print 'Тема: ' . $news->mSubject . '<BR />';
            print 'Новость: ' . $news->mText . '<BR />';
        }
    }
}


?>
После этого вероятность совпадения имен сокращается до минимума.
 

_RVK_

Новичок
обрабатывается тем же процессом что и скрипт куда вставляется
Не всегда, если ты запрашиваешь скрипт PHP с другого домена(в частном случае со своего же, но по HTTP), то сарвер, естественно, не отдаст тебе код, а только результат его выполнения. Иначе любой бы мог смотреть скрипты другого.

Хорошо что ты понимаешь что "действительно делаю что-то не так", просто если бы ты делал все правильно то такой бы проблемы не возникло.

Как делать? Например
1. отказаться от неуниверсальных функций, те тех, которые ты используешь в одном только месте.
2. писать не 1 скрипт, и туда вставлять "кирпичики", а по одному на каждую задачу. Новости, значит news.php а не index.php?mod=news.

Это вообщем, если приведешь примеры кода, смогу посоветовать по существу.
 

ibear

Guest
Originally posted by Diesel

Хорошо что ты понимаешь что "действительно делаю что-то не так", просто если бы ты делал все правильно то такой бы проблемы не возникло.
Действительно - учиться, учиться и еще раз учиться, как завещал самизнаетекто :) . Перелопатил доки и этот форум. Начитался много чего и получил винегрет из советов, подходов и технологий, но многое проясняется.

Про include я действительно ошибся, спасибо что поправили.

PHP:
<? include('http://localhost/super-puper.php'); ?>
решает мою проблему, но я как прилежный ученик решил прислушаться и к другим мнениям.

ООП здесь действительно может хорошо помочь (спасибо за пример jonjonson'у).

Шаблоны (не хочу никого обидеть) все-таки мне не нравятся, т.к. считаю, что в самом php заложен принцип шаблонизации.

Diesel, спасибо за советы. Что касается кода, то как его исправить я, в принципе, понял.
 

jonjonson

Guest
Автор оригинала: ibear
ООП здесь действительно может хорошо помочь (спасибо за пример jonjonson'у).
Главное в ООП не переусердствовать. Оно все одно на функционале построено и функционалом вяжется. И еще, построение классов должно быть разумно абстрактным и максимально прикладным относительно решаемых задач.

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

Screjet

Новичок
Еще понравятся. Это ты просто страничек с кучей отображаемых сервисов не делал и с дизайнерами в паре не работал :)
Встречный вопрос: чем вымышленные теги лучше ПХП-шных?
 

Screjet

Новичок
Originally posted by Diesel
Screjet
Какие вымышленные? Ты о чем? Поясни.
Почти во всех шаблотронах свои собственные теги, в которых заменяемая/обрабатываемая/инфа.
Если бы веб-программирование было бы в perl, python подобных, вопросов бы не было. Сам интерпретатор рассматривает обрабатываемый файл как код. Там без шаблотронов = никуда.
Но в ПХП специально задумали теги для кода, в которых вывод результатов обратотки сам зенд завещал :)
В итоге тот же самый шаблон, только вместо тегов шаблотрона пхп-теги.
 
Сверху