2015-07-07 34 views
6

Zacząłem uczyć się OOP w PHP. Udało mi się napisać kod, w którym podklasa rozszerzyłaby nadklasę, która zawiera połączenie z bazą danych. Teraz zamiast rozszerzania lub korzystania z podklasy, istnieje sposób, w którym mogę uczynić tę klasę połączeń globalną, aby każda klasa mogła używać jej obiektu bez konieczności jej rozszerzania?Jak korzystać z klas globalnych, które nie są ograniczone do zakresu klas?

Uwaga: poniżej, muszę użyć $this->pdo, aby uwzględnić instancję klasy. Czy istnieje sposób, w jaki można utworzyć instancję obiektu w tej klasie, np. $pdo=new PDO(); i użyć tego obiektu jako $pdo, gdziekolwiek chcę?

Czy pomoc klasy statycznej w tym scenariuszu?

class connection 
{ 
    public $servername = "localhost"; 
    public $username = "root"; 
    public $password = ""; 
    public $dbname = "carrental"; 
    public $port="3306"; 
    public $pdo; 

    function addConnection() 
    { 
     try { 
      $this->pdo = new PDO("mysql:host=$this->servername;port=$this->port;dbname=$this->dbname", $this->username, $this->password); 
      $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } catch(PDOException $e) { 
      echo 'ERROR: ' . $e->getMessage(); 
     } 

     $this->pdo->query("use $this->dbname"); 
    } 
} 

Tried Singleton jak poniżej, ale może doradzić, co jest nie tak, jak ja się błąd krytyczny i ostrzeżenie.

(!) Fatal error: in C:\wamp\www\carRental\index.php on line 20 (!)
PDOException: in C:\wamp\www\carRental\index.php on line 20 Call Stack

Time Memory Function Location 1 0.0012 143752 {main}()
..\index.php:0 2 0.0012 144296 car->__construct() ..\index.php:50

3 0.0013 144272 connection->addConnection() ..\index.php:39
4 0.0989 150800 query () ..\index.php:20

<?php 
class connection 
{ 
    public $servername = "localhost"; 
    public $username = "root"; 
    public $password = ""; 
    public $dbname = "carrental"; 
    public $port="3306"; 
    public static $pdo; 

    function addConnection() 
    { 
     try { 
      self::$pdo = new PDO("mysql:host=$this->servername;port=$this->port;dbname=$this->dbname", $this->username, $this->password); 
      self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } catch(PDOException $e) { 
      echo 'ERROR: ' . $e->getMessage(); 
     } 

     self::$pdo->query("use $this->dbname"); 
     return self::$pdo; 
    } 
} 
class car 
{ 
    public $name; 
    public $maker; 
    public $type; 
    public $colour; 
    public $passanger; 

    public function __construct($param1,$param2,$param3,$param4,$param5) 
    { 
     $this->name=$param1; 
     $this->maker=$param2; 
     $this->type=$param3; 
     $this->colour=$param4; 
     $this->passanger=$param5; 
     connection::addConnection(); 
    } 
    public function addCar() 
    { 
     $sql="INSERT INTO car(car_name,car_maker,car_type,car_colour,num_passanger)VALUES('{$this->name}','{$this->maker}', '{$this->type}','{$this->colour}','{$this->passanger}')"; 
     $stmt = $this->$pdo->prepare($sql); 
     $stmt->execute(); 
     echo "Data inserted!"; 
    } 
} 

$car1=new car("Honda Accord","Honda","5 wheeler","Red",8); 
$car1->addCar(); 

?> 
+2

Google "Dependency Injection" –

+3

Przeczytaj o wzorze Singleton. – Barmar

+0

... a gdy przeczytasz o wzorzec singleton również zauważyć krytykę, np. tutaj: http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons. I drugi wtrysk zależności na singleton dla połączeń z bazami danych, https://en.wikipedia.org/wiki/Dependency_injection – VolkerK

Odpowiedz

1

Jak widzę ten wiersz problemy powodują connection::addConnection();
Próbujesz wywołać addConnection jak metody statycznej.
Funkcja statyczna oznacza, że ​​nie trzeba tworzyć wystąpienia klasy, aby wywołać tę funkcję. !Ale! gdy wywołasz tę metodę statycznie, nie możesz użyć właściwości ani właściwości statycznych tej klasy. Tak więc wszystkie pola powinny być oznaczone jako statyczne, ponieważ w przeciwnym razie nie będziesz mieć żadnego hasła db, login i tak dalej.
TL: DR
Wystarczy zaznaczyć "addConnection()" jako
public static function addConnection()
i można użyć statycznej właściwości/funkcje klasy.

+0

Zrobiłem funkcję static i nazwałem ją connection :: addConnection(); ale emituje błąd. Błąd ogólny: wywołanie funkcji składowej prepare() na obiekcie nie będącym obiektem w C: \ wampie \ www \ carRental \ index.php na linii 44 – 112233

+0

Ten błąd jest spowodowany, ponieważ dodano "$" przed " pdo "in" $ this -> $ pdo-> prepare ($ sql); " Kiedy dodasz dodatkowy znak dolara ($), który nie jest wymagany, PHP zrobi trochę "magii" - rzuci zmienną na ciąg, a następnie spróbuje wyzwolić element, który ma nazwę jako ciąg. Na przykład. mamy zmienną "$ string =" pdo "". Teraz, kiedy piszesz jak w swoim Kodzie - "$ this -> $ string-> something", kod, który będzie parsowany, będzie wyglądał "$ this-> pdo-> something". Kiedy nie użyjesz znaku dolara przed "$ string" - "$ this-> string-> something" - spowoduje to błąd, ponieważ samochód nie ma elementu "string". – Warzyw

+0

A jeśli usuniesz drugie "$" z tej linii - $ this -> $ pdo-> prepare ($ sql); spowoduje również błąd. Ponieważ zmienna składowa "pdo" ma wartość null.A null nie jest obiektem i nie ma funkcji "przygotować". Musisz napisać coś takiego; połączenie :: pdo-> przygotowanie ($ sql) – Warzyw