..:: pingu ::..
5.05.2004, 14:33:46
Dopiero zaczynam sie bawić OOP wie proszę powiedzcie czy to jest poprawie...
[php:1:7d670a965c]<?php
class mysql
{
var $host;
var $user;
var $pass;
function connect()
{
return mysql_connect( $this->host , $this->user , $this-base );
}
function query( $sql )
{
return mysql_query( $sql );
}
}
class counter
{
function counter()
{
$tmp = mysql::query( $sql );
}
}
?>[/php:1:7d670a965c]
mam wiec pytanie czy takie cosik jest poprawne ( bo u mine działa ), albo czy można to jakos inaczej zrobic.
splatch
5.05.2004, 15:23:14
Oto jaka konstrukcja klasy byłaby w miarę rozsądna.
[php:1:9c50a33448]<?php
class sql_db
{
//połacz z baza
function sql_db( $db_host, $db_user, $db_pass, $db_name )
{
if( !$this->connect = @mysql_pconnect( $db_host, $db_user, $db_pass ) )
{
if( !$this->connect = @mysql_connect( $db_host,$db_user, $db_pass ) )
{
exit( 'Przepraszamy, ale strona jest chwilowo niedostępna.' );
}
}
if( $this->connect )
{
if( !$this->select = @mysql_select_db( $db_name ) )
{
exit( 'Przepraszamy, ale strona jest chwilowo niedostępna.' );
}
}
else
{
exit( 'Przepraszamy, ale strona jest chwilowo niedostępna.' );
}
}
function close()
{
return @mysql_close( $this->connect );
}
function query( $query )
{ // zwraca i zapisuje
return $this->result = @mysql_query( $query );
}
function fetch_array( $result = null )
{
if( $result === null )
{
return @mysql_fetch_array( $this->result );
}
else
{
return @mysql_fetch_array( $result );
}
}
function num_rows( $result = null )
{
if( $result === null )
{
return @mysql_num_rows( $this->result );
}
else
{
return @mysql_num_rows( $result );
}
}
function fetch_row( $result )
{
if( $result === null )
{
return @mysql_fetch_row( $this->result );
}
else
{
return @mysql_fetch_row( $result );
}
}
function fetch_object($result)
{
if( $result === null )
{
return @mysql_fetch_object( $this->result );
}
else
{
return @mysql_fetch_object( $result );
}
}
function error()
{
return @mysql_error( $this->connect );
}
}
?>[/php:1:9c50a33448]
Zbudowana w ten sposób klasa obsłuży coś takiego:
[php:1:9c50a33448]<?php
$sql = new sql_db( 'localhost', 'splatch', 'splatch', 'splatch' );
$sql->query( 'SELECT * FROM teksty' );
while( $row = $sql->fetch_array( ) )
{
echo $row['pole'] .'<br>';
}
?>[/php:1:9c50a33448]
i obsłuży coś takiego
[php:1:9c50a33448]<?php
$sql = new sql_db( 'localhost', 'splatch', 'splatch', 'splatch' );
$x = $sql->query( 'SELECT * FROM teksty' );
while( $row = $sql->fetch_array( $x ) )
{
echo $row['tekst'] .'<br>';
$query = $sql->query( 'SELECT * FROM autorzy WHERE autor = "'. $row['autor'] .'"' );
if( $res2 = $sql->fetch_array( $query ) )
{
echo 'Autor '. $row2['nick'];
}
}
?>[/php:1:9c50a33448]
W tej klasie nie jest jeszcze wprowadzone zaawansowane sprawdzanie, czy dane z zapytania zostały wyświetlone itd., ale nic nie stoi na przeszkodzie, aby to zrobić.
Grzesiek
5.05.2004, 15:30:45
Powinienes poprawic klase counter, zeby wygladala tak:
[php:1:9b3224a53e]<?php
class counter extends MySQL
{
function counter()
{
$tmp = parent::query( $sql );
}
}
?>[/php:1:9b3224a53e]
..:: pingu ::..
5.05.2004, 16:00:15
ok czyli musze dziedziczyć oraz dać
[php:1:fec861da7b]<?php
parent::funkcja();
?>[/php:1:fec861da7b]
a jesli zrobie:
[php:1:fec861da7b]<?php
class mysql
{
var $x;
var $y
function foo{
echo $this->x;
}
}
class counter extends mysql
{
function foo{
echo parent::y;
}
}
class jakas_tam3 extends counter
{
}
?>[/php:1:fec861da7b]
to jak sie odwołac do początkowej funkcji w mysql ( chodzi o foo)
parrent::foo ?
splatch
5.05.2004, 16:12:37
Jeśli użyjesz dziedziczenia możesz użyć:
[php:1:a91988da9b]<?php
$this->metoda_z_klasy_nadrzednej( $dane );
?>[/php:1:a91988da9b]
Nie ma potrzeby odwoływania się poprzez parent.
W twoim przykładzie może to być:
[php:1:a91988da9b]<?php
class mysql
{
var $x = 'lala';
var $y
function foo{
echo $this->x;
}
}
class counter extends mysql
{
function bar{
echo $this->foo();
echo $this->x;
}
}
?>[/php:1:a91988da9b]
Cytat
Jeśli użyjesz dziedziczenia możesz użyć:
[php:1:802fa84663]<?php
$this->metoda_z_klasy_nadrzednej( $dane );
?>[/php:1:802fa84663]
Nie ma potrzeby odwoływania się poprzez parent.
Pod warunkiem, że w obecnej klasie, z której wywołujemy metodę nie ma metody o nazwie "metoda_z_klasy_nadrzednej", bo jeśli takowa będzie to przykryje metodę z klasy, z której dziedziczymy ;-) Trochę zagmatwałem, ale chyba zrozumiesz :-)
splatch
6.05.2004, 14:23:50
No tak dlatego metody we wcześniejszym fistingu mają różne nazwy

.
Wiem, wiem tylko przypominałem o możliwości wystąpienia takiego przypadku ;-)
..:: pingu ::..
6.05.2004, 15:13:13
tylko jak sie odołam wewnątrz klasy counter do klasy funkcji w klasie mysql tak?
[php:1:84ca210efc]<?php
mysql::connect();
?>[/php:1:84ca210efc]
to jest to nie poprawnie?
bo w PHP5 widziałem gdzies taką możliwosc, a nie wiem czy występuje ona w PHP4
mysql::connect() w ten sposób odwołujesz się do metody statycznej.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.