class md5 {
static public function get_hash() {// код метода }
}
а теперь где-то в коде можно сделать следуйщее:
md5::get_hash();
множественное наследование ? (php5)
class a {методы}
class b {методы}
class c {методы}
мне надо что бы class a унаследовал класы b,c
Каким образом можно реализовать ? :confused:
Да, множественного наследования нет. Но можно использовать интерфейсы.
http://www.npj.ru/long/php/powerprogramming/chapter3/ , имхо, изложено лучше чем в мане.
Кстати рекомендую прочесть:
Для чего тебе это нужно, опиши подрбно ситуацию. Тут народ знающий, поможет (если это не из разряда "я так хочу и точка").
вот читаю уже ман два раза вдоль и поперек, но не пойму с чем едят эти интерефейсы ?
проблема в том, что я не вижу смысла в этих интерфейсах:(
я читал где то, что одним из преимуществ подхода ООП, является не повторение кода...
ну например: создам я интерфейс в котором будут описаны в основном соглашения, которым этот класс должен следовать...
а все равно в каждом классе наследнике моего интерфейса мне надо будет каждый раз прописывать обявленый объект, или я не понимаю что то...
Опиши ситуацию, может ты выбрал неправильный подход к реализации. Может имеет смысл перестроит классы?
Цитата: 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();
}
}
}
}
?>
######################################
# Базовая 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);
}
}
?>
##################################
# 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);
}
}
?>
########################################
# Шифрование 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:
а может методы из класа md5 сделать static ?
Цитата: Lone Wolf
а может методы из класа md5 сделать static ?
что значит static ?
и что изменится после этого?
З.Ы: я еще зеленый редиска - новичок :p
Например есть класс дорога и есть класс автомобиль они хоть и взаимосвязаны, но ника друг к другу не относятся. Примеры хорошего наследования:
Код:
class Human {}
class Children extends Human {}
class Children extends Human {}
Это хороший пример и хорошая практика. Ребёнок это тоже человек и он может наследовать все "качества" человека и вносить свои. В твоём случае необходимо просто использовать функционал класса то можешь использовать их внутри (прошу прощения, в код невдавался, спать просто хочется)
Код:
class security_HTTP
{
private $db;
private $md5;
public funtion __construct()
{
$this->db = new MySQL();
$this->md5 = new Md5();
}
}
{
private $db;
private $md5;
public funtion __construct()
{
$this->db = new MySQL();
$this->md5 = new Md5();
}
}
Примерно так.
PS название классов копировать не стал, думаю и так всё понятно.
PSS И прочитай ещё про DocBlock. Учись писать правильно сразу.
Цитата: bobik02
что значит static ?
и что изменится после этого?
З.Ы: я еще зеленый редиска - новичок :p
и что изменится после этого?
З.Ы: я еще зеленый редиска - новичок :p
Это значит, что ты сможеш вызовать методы класса не создавая его экземпляр. т.е.
Код:
2Lone Wolf А тебе учить синтаксис ааать два :))
Цитата: shaelf
2Lone Wolf А тебе учить синтаксис ааать два :))
Да с синтаксиом проблемы. так как на ПХП не програмлю. было дело чуть учил для общего развития и все. Щас больше на жаве.
Вроде исправил.
UPD:
2bobik02 вот почитай про статик http://ua.php.net/manual/ru/language.oop5.static.php
Код:
class a {
private $cB;
//...
}
class b { /* */ }
private $cB;
//...
}
class b { /* */ }
в программе
Код:
$a = new a;
$b = new b;
$a->cB = & $b;
$b = new b;
$a->cB = & $b;
и нормально работаю... не знаю правда насколько это правильный подход..
Цитата: shaelf
2Lone Wolf А тебе учить синтаксис ааать два :))
Дык он на C++ просто написмал ))
Цитата: Mr.Hacker
я в пхп обычно без наследования работаю...
и нормально работаю... не знаю правда насколько это правильный подход..
и нормально работаю... не знаю правда насколько это правильный подход..
В конкретном примере так и надо делать и это правильно, как уже описал shaelf. А вот в общем случае совсем без наследования нельзя.
2Mr.Hacker Многие замечательно и на процедурном работают :)