problema clase, folosire proprietate in clasa extinsa

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
ionut
Mesaje:26

problema clase, folosire proprietate in clasa extinsa

Salut,

De cateva zile imi bat capul cu o anumita problema si nici ca-i dau de cap :?
Am clasa connection din care am extins clasa create_delete, ambele clase sunt instantiate in fisierul index.php.

Am sa redau mai jos cele doua clase si indexul unde sunt instantiate:
Fisierul class.connection.php ce contine clasa connection

Cod: Selectaţi tot

<?php
class connection{
		
	//	proprietatile clasei
	public	$server;
	public	$user_name;
	public	$password;
	public	$database_name;
	public	$conectare;
		
	//	metoda construct care face conectarea la bd
	public function __construct($server, $user_name, $password, $database_name){
			
		$this->server			=	$server;
		$this->user_name		=	$user_name;
		$this->password			=	$password;
		$this->database_name	=	$database_name;
			
		$this->conectare		=	new mysqli($this->server, $this->user_name, $this->password, $this->database_name);
			
		if (mysqli_connect_errno()){
			exit('Conectare nereulita la baza de date: '. mysqli_connect_error());
		}
		else echo '<br> Esti conectat la baza de date => ' . $this->database_name;
	}
}
?>
Fisierul class.create_delete.php ce contine clasa create_delete

Cod: Selectaţi tot

<?php
include('class.connection.php');
	
class create_delete extends connection{
		
	//	proprietatile clasei
	public	$nume_tabel;
	public	$numar_coloane;
	public	$nume_coloane	=	array();
		
		
	//	metoda construct
	public function __construct($nume_tabel, $numar_coloane, $nume_coloane){
			
		$this->nume_tabel		=	$nume_tabel;
		$this->numar_coloane	=	$numar_coloane;
		$this->nume_coloane		=	$nume_coloane;
	}
		
		
	//	metoda pt creare tabel
	public function CREEAZA_TABEL(){
			
		if($this->numar_coloane > 1){
				
			// interogare sql pentru CREARE TABEL
			$tabel = "CREATE TABLE `" . $this->nume_tabel . "` ( ";
					
			for($i = 0; $i < $this->numar_coloane; $i++){
				if($this->nume_coloane[$i] == 'id'){
					$tabel	.=	"`" . $this->nume_coloane[$i] . "` INT(3) UNSIGNED AUTO_INCREMENT PRIMARY KEY, ";
				}
				elseif($this->nume_coloane[$i] !== 'data'){
					$tabel	.=	"`" . $this->nume_coloane[$i] . "` CHAR(25) , ";
				}
				else{
					$tabel	.=	"`" . $this->nume_coloane[$i] . "` TIMESTAMP ";
				}
			}
					
			$tabel	.=	" ) CHARACTER SET utf8 COLLATE utf8_general_ci";
				
			// Executa interogarea $tabel query pe server pentru a crea tabelul
			if ($conectare->query($tabel) === TRUE) {
				echo 'Table "users" successfully created';
			}
			else {
				echo 'Error: '. $conectare->error;
			}
		}
	}
}
?>
Fisierul index.php in care sunt instantiate clasele

Cod: Selectaţi tot

<?php

$date_conectare	=	array("localhost", "root", "", "lacafeabd");
	
$date_tabel		=	array("user", "id", "nume", "e-mail", "parola", "data");

include('class.create_delete.php');

$clasa_conectare		=	new connection($date_conectare[0], $date_conectare[1], $date_conectare[2], $date_conectare[3]);
	
$clasa_creare_stergere	=	new create_delete(array_shift($date_tabel), count($date_tabel), $date_tabel);

echo $clasa_creare_stergere->CREEAZA_TABEL();
?>
Problema apare in a doua clasa atunci cand se executa interogarea $tabel query() pe server pentru a crea tabelul, daca nu folosesc OOP e destul de simplu, folosesc variabila care contine conectarea la baza de date si functioneaza, in schimb aici conectarea la baza de date o am in proprietatea $conectare a primei clase si in loc de a scrie $conectare->query($tabel) am incercat $this->conectare->query($tabel) plus inca cateva variante, toate cu acelasi rezultat, erori de diferite tipuri.

Ideea e ca nu stapanesc prea bine OOP si sunt inca in curs de invatare :D de aceea orice explicatie e foarte bine venita.
Multumesc!

MarPlo Mesaje:4343
Salut
Problema cu clase extinse si folosire proprietati de la una la alta e mai complicata.
Proprietatea $conectare e definita in __constructor() in clasa parinte, iar ca sa o folosesti cu $this>conectare in clasa copil, in constructor-ul ei trebuie executat si constructor-ul clasei parinte, cu parametri necesari lui, folosind in clasa copil: parent::__construct($server, $user_name, $password, $database_name);
- Exemplu:

Cod: Selectaţi tot

class BaseClass {
  public $prop ='';
  function __construct($v1) {
     $this->prop = $v1;
  }
}

class SubClass extends BaseClass {
  public $prop2 ='';
  function __construct($v1, $v2) {
    parent::__construct($v1);  //executes the instructions from parent construct
    $this->prop2 = $v2;
  }

  //method that uses $prop defined in BaseClass
  public function getProp(){
    $re = $this->prop .' -- '. $this->prop2;
    return $re;
  }
}

//use the SubClass
$obj = new SubClass('v1', 'v2');
echo $obj->getProp();  // v1 -- v2
- Pentru mai multe detalii si exemple din care poti sa inveti, studiaza ce e in lectia de pe site de la pagina: https://marplo.net/php-mysql/oop-cla ... enire.html , si poti cauta pe net: "php class extends constructor".

ionut Mesaje:26
S-a rezolvat, multumesc ... foarte, foarte util din nou! ;) ;)

Subiecte similare