От начинающего в php. Есть функция с $this, нужно разделить ее на две.

chainik

Новичок
От начинающего в php. Есть функция с $this, нужно разделить ее на две.

Сабж. Теперь подробно.
В двух словах: программлю преимущественно на 1С, есть некоторый опыт в дельфи (давно уже), клиппере (уже в прошлом веке) :). На данный момент читаю факи и доки по эхотагу. Но инфы много, а времени мало. Извиняюсь, если где-нибудь что-нибудь напутаю с терминологией, так сказать.
Нужно пару пинков в нужную сторону, дальше само пойдет;).

Имеется функция, которая заполняет базу mysql. Вызывается из html.
Примерно следующего вида (оставил более значимые на мой взгляд места):
PHP:
function in_price_add()
{
	if (!is_uploaded_file( $this->prixod_tmp_name ))
	{ return(70); }
...
	$rows = file ($this->prixod_tmp_name); 
	$rowsCount = sizeof($rows); 
...
	for ($i= $end_Head + 1 ; $i<$rowsCount; $i++) 
...
					$this->sql_query="INSERT INTO `".$this->PREFICS."_vids` ( `uid` ,  `name`  ) VALUES ('".trim($tds[0])."',  '".trim($tds[1])."' ) ";
					$this->sql_execute();
...
}
Необходимо сделать следующее:
1. Добавить функцию автоматического заполнения таблицы mysql при появлении определенного файла в каталоге на сайте. С этим проблем особых пока не вижу (подготовил ссылку на файл и вызвал кусок этой функции, который как раз и хочу выделить в отдельную функцию update_table($rows)).
2. Оставить головную часть этой функции именно как in_price_add(), которая вызывается из html-я: т.е. проверку на загрузку файла и еще часть строк, после чего вызвать функцию update_table($rows).
3. Выделить остальную часть функции в отдельную функцию update_table($rows), которая должна обрабатывать файл, на который ссылается $rows и заносить данные в таблицу mysql. Предполагается, что данная функция будет вызывать не только первыми двумя, т.е. должна быть универсальной. Может быть ссылки $this можно заменить на что-то иное? Т.е. данная функция должна только брать ссылку на файл (возможно будет второй параметр, который будет указывать какую именно таблицу обновлять, например, остатки или новинки) и больше ни от чего не зависеть.

В итоге должно получиться что-то вроде этого:
PHP:
function auto_price_update()
{
...
	$rows = file($this->infile);
	update_table($rows);
...
}

function in_price_add()
{
	if (!is_uploaded_file( $this->prixod_tmp_name ))
	{ return(70); }
...
	$rows = file ($this->prixod_tmp_name); 
	update_table($rows);
}

function update_table($rows)
{
	$rowsCount = sizeof($rows); 
...
	for ($i= $end_Head + 1 ; $i<$rowsCount; $i++) 
...
					$this->sql_query="INSERT INTO `".$this->PREFICS."_vids` ( `uid` ,  `name`  ) VALUES ('".trim($tds[0])."',  '".trim($tds[1])."' ) ";
					$this->sql_execute();
...
}

Как я понимаю переменная $this ссылается на вызываемый объект. В нынешем варианте - html (или как-то так).
Пока такие вопросы:
1. на что будет ссылаться $this в строке sql_query, если эта строка будет находиться в функции update_table(), вызванной из функции in_price_add(), вызванной со странички?
2. на что будет ссылаться $this в строке sql_query, если эта строка будет находиться в функции update_table(), вызванной из функции auto_price_update(), вызванной по cron-у при появлении нужного файла в нужной папке?
3. как можно изменить строку "$this->sql_query...", чтобы не зависеть от вызываемого объекта?

Если нужно - могу дать дополнительную инфу. Главный вопрос: что нужно?

ЗЫ Ушел читать дальше доки и ковырять то, что уже вроде бы понятно. ;)

Спасибо.
 

zerkms

TDD infected
Команда форума
Имеется функция, которая заполняет базу mysql. Вызывается из html.
так не бывает
phpfaq.ru/na_tanke

на что будет ссылаться $this
$this всегда ссылается на текущую инстанцию объекта, и не важно в каком контексте используется данная ссылка - в качестве операнда конкатенации или, например, аргумента функции.

ps: и, кстати, в одном запросе можно вставить несколько записей за один раз
... VALUES (...), (...), ...

pps: в пхп есть foreach для обхода массивов
 

chainik

Новичок
Автор оригинала: zerkms
так не бывает
phpfaq.ru/na_tanke
Ну, в смысле, скрипт запускается по кнопке со странички.;)

$this всегда ссылается на текущую инстанцию объекта, и не важно в каком контексте используется данная ссылка - в качестве операнда конкатенации или, например, аргумента функции.
Не то, чтобы дошло. Где бы подробнее про это почитать-с? Или просто другими словами. Как бы основной затык именно в этом сейчас. ;)
Смотрю сейчас первый пример:
http://www.php.net/manual/ru/language.oop5.basic.php
Т.е. при вызове функции foo() из класса B, мы получаем, что $this - это класс B. Верно? А если мы добавим в класс A еще одну функцию start(), например, и попытаемся вызвать ее из функции foo() через $this->start(), предварительно вызвав функцию foo() из класса B, то тогда функция start() не будет найдена, т.к. $this будет ссылаться на B. А в классе B нет такой функции. Или я что-то не так понимаю? Сорри, если несколько сумбурно (тут еще бегают по мелочам отвлекают :mad: ).

ps: и, кстати, в одном запросе можно вставить несколько записей за один раз
... VALUES (...), (...), ...

pps: в пхп есть foreach для обхода массивов
Это все писал не я. Я только пытаюсь разобраться со всем этим. ;)
Как оно все написано - мне самому не нравится. Уже хотя бы потому, что отступы непонятно как сделаны - структуру временами вообще не поймешь, пока не расставишь все по местам:(
 

zerkms

TDD infected
Команда форума
Ну, в смысле, скрипт запускается по кнопке со странички.
какая нам разница, как он запускается? есть факт - скрипт запущен, кем и как инициирован запуск в данном вопросе неважно. или важно? :)

Т.е. при вызове функции foo() из класса B, мы получаем, что $this - это класс B. Верно?
не совсем. $this - это инстанция (объект) класса Б

А если мы добавим в класс A еще одну функцию start(),
накидай примитивный пример, который воплотит твоё сумбурное описание в коде :)
 

chainik

Новичок
Автор оригинала: zerkms
какая нам разница, как он запускается? есть факт - скрипт запущен, кем и как инициирован запуск в данном вопросе неважно. или важно? :)
Ну основной вопрос - это как на контекст вызвавшего скрипт объекта ссылаться.

не совсем. $this - это инстанция (объект) класса Б
Ушел читать про "инстанцию объекта";).

накидай примитивный пример, который воплотит твоё сумбурное описание в коде :)
PHP:
class A
{
    function foo()
    {
        $this->start();
    }
    function start()
    {
        echo "Функция start() запущена\n";
    }
}

class B
{
    function bar()
    {
        A::foo();
    }
}
$b = new B();
$b->bar();
Вот примерно такое. Тут функция start() будет таким образом запущена?
 

zerkms

TDD infected
Команда форума
Ну основной вопрос - это как на контекст вызвавшего скрипт объекта ссылаться.
ты же сам сказал, что скипт вызван нажатием кнопки в html. в хтмл нет никаких объектов из пхп. ссылка на на_танке в первом посте, читай.
Ушел читать про "инстанцию объекта"
класса, а не объекта

Вот примерно такое. Тут функция start() будет таким образом запущена?
она вообще не будет запущена (и это проверяется локально, без задавания вопросов на форум). потому что при статическом вызове объекты не создаются
если тебе нужна только статика, то поменяй
$this->start() на self::start()
 

chainik

Новичок
Автор оригинала: zerkms
ты же сам сказал, что скипт вызван нажатием кнопки в html. в хтмл нет никаких объектов из пхп. ссылка на на_танке в первом посте, читай.
Прочитал уже. Понял.:)

класса, а не объекта
ОписАлся. Голова уже пухнет от всякого разного;)

она вообще не будет запущена (и это проверяется локально, без задавания вопросов на форум). потому что при статическом вызове объекты не создаются
если тебе нужна только статика, то поменяй
$this->start() на self::start()
Понятно.

ЗЫ Впрочем, по части $this уже не актуально - это я уже уточняю, чтобы понять данный момент вообще. В конкретном случае все нужные функции вроде бы находятся в пределах одного класса - следовательно проблем возникнуть не должно.
В целом по данному вопросу в общих чертах все понятно - ушел читать доки дальше. Просветленный;). Спасибо.

ЗЗЫ Для проверки локально - настраиваю сейчас сервак между делом. Чтобы экспериментировать.
 

AmdY

Пью пиво
Команда форума
chainik
скачай http://www.denwer.ru/ и не геморойся пока с настройкой

-~{}~ 02.09.08 08:24:

class A
{
function foo()
{
$this->start();
}
function start()
{
echo "Функция start() запущена\n";
}
}

class B extends A
{
function bar()
{
$this->foo();
}
}
 

chainik

Новичок
Автор оригинала: AmdY
chainik
скачай http://www.denwer.ru/ и не геморойся пока с настройкой
У меня линукс;).
Уже настроил. Правда проблема с кодировкой mysql-базы. Ушел копать в эту сторону.

За пример спасибо. Про extends я как-то и забыл;).

ЗЫ Еще тут масса прямых ссылок на сайт вроде "http://www.site.ru/index.php?...". Поубивав бы. ;)
Не говоря про прямые ссылки на всякие ресурсы, вида /home/site/html/...
Пришлось рабочий каталог сделать там, чтобы особо не гемороится сейчас с этими мелочами.
 
Сверху