у меня есть класс который работает, и я имдаже парой пользуюсь. Но! Есть у меня стойкое ощущение, что всвязи не знания мною ООП(верней крайне плохого знания его синтаксиса и принципов) этот класс напоминает генетического уродца. вот собственно он сам: PHP: <? class Soc{ private static $c_r=0; //счётчик редиректов public static $max_r=2; //максимальное кол-во разрешённых редиректов function construct($url){ $fuuu=$this->oprAdress($url); return ($fuuu); } function oprAdress($url){// удаляем не нужные элементы если пользователь их ввёл $http=strpos($url, "http://");// ищем есть ли ненужные элементы адреса $www=strpos($url, "www."); IF ($http===false){//отмеряем длину строки которую нужно(если нужно) отрезать //echo 1; $h=0; } ELSE{ $h=7; } IF ($www===false){ $w=0; } ELSE{ $w=4; } $first_h=(0+$h)+$w; $host=substr($url, $first_h); // удаляем не нужные элементы если пользователь их ввёл $last_h=strpos($host, "/"); //проверяем есть ли слешь IF($last_h!=''){ $ger=$this->hostAndPage($host, $first_h, $last_h);//если он есть то это не "индексевая страница" } ELSE{ $ger=$this->host($host, $first_h);//если нету то "индексавая" } $e=$ger; return $ger; } function hostAndPage($host, $first_h, $last_h){//подготовка к получение контента с "не индексовой" страницы $adress[0]=substr($host, 0, $last_h); $adress[1]=substr($host, $last_h); $f=$this->getCon($adress); return $f; } function host($host, $first_h){ //подготовка к получение контента с "индексовой" страницы $adress[0]=substr($host, 0); $adress[1]="/"; $f=$this->getCon($adress); return $f; } function getCon($adress){//получение контента //print_r($adress); $fp = fsockopen($adress[0], 80, $errno, $errstr, 30); IF (!$fp) { echo "$errstr ($errno)<br />\n"; } ELSE { $out.= 'GET '.$adress[1].' HTTP/1.1'."\r\n"; $out.= 'Host: '.$adress[0]."\r\n"; $out.= 'Connection: Close'."\r\n\r\n"; fwrite($fp, $out); WHILE (!feof($fp)) { $zagolov.=fgets($fp, 128); IF (strpos($zagolov,"\r\n\r\n")){ break; } } WHILE (!feof($fp)) { $htm.=fgets($fp, 128); } fclose($fp); } IF(strpos($zagolov, "Location:") AND Soc::$max_r!=0 AND Soc::$c_r<=Soc::$max_r-1){//есть-ли ридерект Soc::$c_r=Soc::$c_r+1; $q=$this->redUrl($zagolov); return $q; } ELSE { return array($zagolov, $htm); } } function redUrl($zag){ //отлов ридеректа $start=strpos($zag, "Location"); $start=$start+10; $url=substr($zag, $start); $end=strpos($url, "\r\n"); $url=substr($url, 0, $end); $k=$this->oprAdress($url); return $k; } } не могли бы вы, уважаемые комрады по форуму, напримере этого безобразия показать к правельно стоит писать классы? Буду премного благодарен=)
GudGuy Если весь этот класс предназначен только для того, чтобы по URL получить содержимое со стороннего сервера, но я бы это сделал через cURL и не мучил бы ООП вовсе. Там есть и опция для следования по редиректам, и для максимального количества редиректов. В данном конкретном случае ООП тут ни к чему. Это тянет максимум на обычную функцию: function site_get_contents($address)
Dagdamor спасибо, изучу на досуге=) но сейчас меня интересует именно сторона ООП=) был бы очень благодарен за критику и советы как лучше=)
Dagdamor основной приченой таких издевательств был подсчёт ридеректов, и гибкость=) самого меня несколько беспокоет то что он построен так, что в каждой функции приходиться делать ретун, мне кажеться это не совсем верным....
Горбунов Олег спасибо. кстати, может есть хороший мануаль по ООП? или книжка? чтоб учили не только стрелочки ставить, но и правильно проектировать? или настоящий программист должен сам до всего дойти методом проб и ошибок?
http://www.books.ru/shop/books/352130 http://www.books.ru/shop/books/156126 http://www.books.ru/shop/books/30436
http://www.books.ru/shop/books/156126 - этой в продаже нет, и не ожидается Я пытался купить, меня обломали. http://www.books.ru/shop/books/30436 - эту уже отправили, на неделе прийдет.
А по факту - у тебя не ООП, а набор функций в неймспейсе ) Да и не очень понятно, зачем у тебя намешаны статические вызовы с динамическими...
Предлагаю отойти на время от особенностей реализации, и прочесть http://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование А потом взглянуть заново на свой класс, и задать появившиеся вопросы, как тебе?
А у меня есть "Рефакторинг", только, видимо, рано купил, не могу пока оценить её, видимо из-за отсутствия опыта. :-\
Нет такого понятия как "правильное ООП", нужно просто научиться граматно проектировать инфосистемы ! Насчёт книжек - прочёл штук 10 по J2SE/J2EE, ничего кроме "+" я от этого не получил, да и намного проще познать азы ООП, когда пишешь на полнофункциональном объектно-ориентированном языке. J2EE и прилагающие это вообще кладезь идей и реализаций фреймворков для корпоративных приложений. Будет трудно, но в общеобразовательных целях - советую.
Не хочу устраивать войнушку религиозную, но ты решил, что Java полнофункциональном ООП язык потому что всё в нём нужно пихать в классы? :roll:
lexa Он был изначально спроектирован как объектно-ориентированный язык и это ФАКТ В холиворах я не участвую , у каждого языка есть свои плюсы и минусы и где и когда какой "инструмент" лучше использовать - личное дело каждого.
Горбунов Олег почитал... и почитал кое что ещё... в голове конечно прояснилось, но не так что б очень... о своём классе я могу сказать что это извращённый способ разделения кода используемого при выполнение различных условий(тогда мне казалось что для этого ООП и сделан, ныне я понимаю что его возможности ГОРАЗДА шире). а вот про статические и динамические вызовы я не нашёл, только про данные....
GudGuy, ок. Начнем с того, что обьект должен преставлять собой какую либо однозначную сущность. Какую сущность представляет собой твой объект? Или какую должен представлять?
Горбунов Олег он представляет собой некий чёрный ящик в который вводим урл, получаем содержимое страницы. Так же в нём есть ограничение по кол-ву ридерктов с одного адреса(на которое можно влиять снаружи класса). При этом ему обсолютно всё равно как именно был записан адрес... хотя что-то мне подсказывает что это лирика...
Почти. Но близко. Смотри, у тебя объект «размазан» между двумя действиями: подготовкой урла и получением страницы. Т.е. сущностей должно быть две: «получатель страниц» и «разборщик урлов», правильно? Подумай, как лучше сделать - разделить на два независимых обьекта, или расширить один - другим за счет наследования? Если наследовать, то кого от кого?
ну, логичней создать класс работующий со строками, в том числе и с уралми, а от него наследовать классу получающему контент. Мне кажеться что потомок должен быть более "узким" чем родитель