Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

множественное наследование ? (php5)

4.7K
09 октября 2007 года
bobik02
140 / / 11.09.2007
Я так понял ,что в php класс может наследовать только один класс, то есть множественное наследование не поддерживается:(

class a {методы}
class b {методы}
class c {методы}

мне надо что бы class a унаследовал класы b,c

Каким образом можно реализовать ? :confused:
12
09 октября 2007 года
alekciy
3.0K / / 13.12.2005
Да, множественного наследования нет. Но можно использовать интерфейсы.
12
09 октября 2007 года
alekciy
3.0K / / 13.12.2005
Кстати рекомендую прочесть: http://www.npj.ru/long/php/powerprogramming/chapter3/ , имхо, изложено лучше чем в мане.
15
09 октября 2007 года
shaelf
2.7K / / 04.05.2005
Для чего тебе это нужно, опиши подрбно ситуацию. Тут народ знающий, поможет (если это не из разряда "я так хочу и точка").
4.7K
09 октября 2007 года
bobik02
140 / / 11.09.2007
alekciy - благодарю за ссылку...

вот читаю уже ман два раза вдоль и поперек, но не пойму с чем едят эти интерефейсы ?

проблема в том, что я не вижу смысла в этих интерфейсах:(

я читал где то, что одним из преимуществ подхода ООП, является не повторение кода...

ну например: создам я интерфейс в котором будут описаны в основном соглашения, которым этот класс должен следовать...

а все равно в каждом классе наследнике моего интерфейса мне надо будет каждый раз прописывать обявленый объект, или я не понимаю что то...
274
09 октября 2007 года
Lone Wolf
1.3K / / 26.11.2006
Опиши ситуацию, может ты выбрал неправильный подход к реализации. Может имеет смысл перестроит классы?
4.7K
09 октября 2007 года
bobik02
140 / / 11.09.2007
Цитата: shaelf
Для чего тебе это нужно, опиши подрбно ситуацию. Тут народ знающий, поможет (если это не из разряда "я так хочу и точка").



Ок:)

ну вот есть у меня такой класс Базовой HTTP - Авторизации:
class.security_HTTP.php

Код:
<?php

######################################
#  Базовая HTTP - Авторизация  version beta 0.1
######################################

require_once('class.MySQL.php');

 class security_HTTP extends MySQL {
   
    #  метод window_auth()  Окно  авторизации
    private function window_auth() {
     
     Header("WWW-Authenticate: Basic realm=\"Tester\"");
     Header("HTTP/1.0 401 Unauthorized");
     
    }
   
   # метод  protect_admin() - Защита страницы базовой авторизацией
  public function protect_admin() {
       
         // Устанавливаем соединение с БД
         $this->connect();
         
          // Если пользователь не авторизовался - авторизуемся
         if(!isset($_SERVER['PHP_AUTH_USER']))
            {
             $this->window_auth();
              exit();
             }
         else
         {
             // Утюжим переменные $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'],
             // чтобы мышь не проскочила :-D
             if (!get_magic_quotes_gpc())
             {
                 $_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
                 $_SERVER['PHP_AUTH_PW']   = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
            }
           
             $_SERVER['PHP_AUTH_USER'] = str_replace("'","`",$_SERVER['PHP_AUTH_USER']);
             $_SERVER['PHP_AUTH_PW']   = str_replace("'","`",$_SERVER['PHP_AUTH_PW']);
# выборку эту, в будущем я перемещу в класс MySQL,
           
             $query = "SELECT pass FROM userlist WHERE name='".$_SERVER['PHP_AUTH_USER']."'";
             $lst = @mysql_query($query);
             
             // Если ошибка в SQL-запросе - выдаём окно
             if(!$lst)
             {
                 $this->window_auth();
                 exit();
            }
             // Если такого пользователя нет - выдаём окно
             if(mysql_num_rows($lst) == 0)
             {
                 $this->window_auth();
                 exit();
            }
           
                // Если все проверки пройдены, сравниваем хэши паролей md5
# Тут я и хочу использовать третий класс, что бы он декодировал с мд5 и т.п
                $pass = @mysql_fetch_array($lst);
                 if(md5($_SERVER['PHP_AUTH_PW']) != $pass['pass'])
                 {
                     $this->window_auth();
                     exit();
                }
    }
     
     
     
     
    }

}
   
 
?>


Он унаследует простенький класс (и кривой как мне кажется)
class.MySQL.php
Код:
<?php

##################################
#  MySQL version beta 0.1
##################################

 class MySQL {
 
     private $host   = '127.0.0.1:3306'; # Host  name
     private $user   = 'test';          # User name
     private $pass   = 'test';          # Password name
     private $dbname = 'Tel_Rc';         # DataBase name
   
    #  connect to MySQL and  select DataBase
    public function connect() {
         
         $link = mysql_connect($this->host, $this->user, $this->pass); // конект
         if (!$link) {
         die('К сожалению, не доступен сервер MySQL : ' . mysql_error()); // ошибка
         }
         //echo 'Connected successfully';
         
         $db_selected = mysql_select_db($this->dbname, $link);
          if (!$db_selected) {
             die ('К сожалению, не доступна база данных : ' . mysql_error());
          }
         
         
    }

    # Dissconect from MySQL
     public function disconnect() {
     
         $link = mysql_connect($this->host, $this->user, $this->pass);
         mysql_close($link);
    }
   



}

?>


Но существует и третий класс
class.md5.php
Код:
<?php

########################################
#     Шифрование MD5  version beta 0.1
########################################


 class md5_code  {
 
    # get_rnd_iv($iv_len)
    private function get_rnd_iv($iv_len) {
      $iv = '';
      while ($iv_len-- > 0) {
         $iv .= chr(mt_rand() & 0xff);
        }
      return $iv;
    }
   
    # Метод  md5_encrypt($plain_text, $password);
   public function md5_encrypt($plain_text, $password, $iv_len = 16) {
     
      $plain_text .= "\x13";
      $n = strlen($plain_text);
     
      if ($n % 16) $plain_text .= str_repeat("\0", 16 - ($n % 16));
      $i = 0;
      $enc_text = $this-> get_rnd_iv($iv_len);
      $iv = substr($password ^ $enc_text, 0, 512);
     
      while ($i < $n) {
         $block = substr($plain_text, $i, 16) ^ pack('H*', md5($iv));
         $enc_text .= $block;
         $iv = substr($block . $iv, 0, 512) ^ $password;
         $i += 16;
        }
      return base64_encode($enc_text);
    }
   
   
   
    # Метод  md5_decrypt($enc_text, $password);
    public function md5_decrypt($enc_text, $password, $iv_len = 16) {
     
      $enc_text = base64_decode($enc_text);
      $n = strlen($enc_text);
      $i = $iv_len;
      $plain_text = '';
      $iv = substr($password ^ substr($enc_text, 0, $iv_len), 0, 512);
       
       while ($i < $n) {
         $block = substr($enc_text, $i, 16);
         $plain_text .= $block ^ pack('H*', md5($iv));
         $iv = substr($block . $iv, 0, 512) ^ $password;
         $i += 16;
        }
       
      return preg_replace('/\\x13\\x00*$/', '', $plain_text);
    }
 
   
   
}

?>

впринцыпе я могу с третего класса нужные функции через "копировать" , "втавить" во второй клас и все будет работать, но фишка в том что эти методы я еще буду использовать как минимум три раза в разных класах... да я могу в эти класы через ctrl+c ctrl+v вставить нужное мне.. но я читал , что подход ООП не должен допускать повторения кода и т.п

Вот такие дела, Как быть? :confused:
274
10 октября 2007 года
Lone Wolf
1.3K / / 26.11.2006
а может методы из класа md5 сделать static ?
4.7K
10 октября 2007 года
bobik02
140 / / 11.09.2007
Цитата: Lone Wolf
а может методы из класа md5 сделать static ?



что значит static ?
и что изменится после этого?

З.Ы: я еще зеленый редиска - новичок :p

15
10 октября 2007 года
shaelf
2.7K / / 04.05.2005
Тебе нужно разобраться что есть наследование. В твоё случае вообще не должно быть наследования. Учись мыслить объектно, а не процедурно.
Например есть класс дорога и есть класс автомобиль они хоть и взаимосвязаны, но ника друг к другу не относятся. Примеры хорошего наследования:
 
Код:
class Human {}
class Children extends Human {}

Это хороший пример и хорошая практика. Ребёнок это тоже человек и он может наследовать все "качества" человека и вносить свои. В твоём случае необходимо просто использовать функционал класса то можешь использовать их внутри (прошу прощения, в код невдавался, спать просто хочется)
Код:
class security_HTTP
{
    private $db;
    private $md5;

    public funtion __construct()
    {
        $this->db = new MySQL();
        $this->md5 = new Md5();
    }
}

Примерно так.
PS название классов копировать не стал, думаю и так всё понятно.
PSS И прочитай ещё про DocBlock. Учись писать правильно сразу.
274
10 октября 2007 года
Lone Wolf
1.3K / / 26.11.2006
Цитата: bobik02
что значит static ?
и что изменится после этого?

З.Ы: я еще зеленый редиска - новичок :p


Это значит, что ты сможеш вызовать методы класса не создавая его экземпляр. т.е.

 
Код:
class md5 {

static public function get_hash() {// код метода }

}

а теперь где-то в коде можно сделать следуйщее:
md5::get_hash();
15
10 октября 2007 года
shaelf
2.7K / / 04.05.2005
2Lone Wolf А тебе учить синтаксис ааать два :))
274
10 октября 2007 года
Lone Wolf
1.3K / / 26.11.2006
Цитата: shaelf
2Lone Wolf А тебе учить синтаксис ааать два :))


Да с синтаксиом проблемы. так как на ПХП не програмлю. было дело чуть учил для общего развития и все. Щас больше на жаве.
Вроде исправил.

UPD:
2bobik02 вот почитай про статик http://ua.php.net/manual/ru/language.oop5.static.php

271
10 октября 2007 года
MrXaK
721 / / 31.12.2002
я в пхп обычно без наследования работаю...
 
Код:
class a {
 private $cB;
 //...
}

class b { /* */ }

в программе
 
Код:
$a = new a;
$b = new b;
$a->cB = & $b;

и нормально работаю... не знаю правда насколько это правильный подход..
240
10 октября 2007 года
aks
2.5K / / 14.07.2006
Цитата: shaelf
2Lone Wolf А тебе учить синтаксис ааать два :))


Дык он на C++ просто написмал ))

Цитата: Mr.Hacker
я в пхп обычно без наследования работаю...

и нормально работаю... не знаю правда насколько это правильный подход..


В конкретном примере так и надо делать и это правильно, как уже описал shaelf. А вот в общем случае совсем без наследования нельзя.

15
10 октября 2007 года
shaelf
2.7K / / 04.05.2005
2Mr.Hacker Многие замечательно и на процедурном работают :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог