Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] 2 klasy
Forum PHP.pl > Forum > PHP
Lejto
index.php
  1. <?php
  2. include_once("db.class.php");
  3. $db = new mysql();
  4. global $db;
  5.  
  6. include("login.class.php");
  7. $log = new Auth();
  8.  
  9. include("upload.class.php");
  10. $up = new upload();
  11. global $up;
  12. ?>

db.class.php
  1. <?php
  2. class mysql
  3. {
  4.   public $_lacz;
  5.  
  6.   public function __construct()
  7.   {
  8.       $this->_lacz = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  9.   }
  10.  
  11. }
  12. ?>

wywołuje funkcje dodaj z klasy upload
klasa
  1. <?php
  2. class upload extends mysql {
  3. ..[...]
  4.    public function dodaj($n)
  5.    {
  6.        
  7.        
  8.        $result = $this->_lacz->query('zapytanie');    
  9.      
  10.        
  11.        }
  12.        fclose($uchwyt);
  13.    }
  14. }
  15. ?>

i otrzymuje że funkcja query nie ma obiektu ;/ co nie tak?

Pozdrawiam
WebCM
Pokaż wszystkie linijki kodu. Źle to robisz. Jeżeli klasa mysql jest nadrzędna dla upload:
  1. <?php
  2. $result = parent :: $_lacz -> query('zapytanie')
  3. ?>
Nie widzę potrzeby istnienia klasy mysql, jeżeli ma oferować te same funkcje, co MySQLi. Jeśli już chcesz ja deklarować, niech będzie podrzędną dla MySQLi. Wtedy w konstruktorze tej klasy napisz:
  1. <?php
  2. parent :: __construct(parametry)
  3. ?>
Lejto
nic nie dało ;/
klasa upload
  1. <?
  2. class upload extends mysql {
  3.    
  4.    public function upload()
  5.    {
  6.        if($_SESSION['login'])
  7.        {
  8.        $nazwa = $_FILES['plik']['name'];
  9.  
  10.        if(move_uploaded_file($_FILES['plik']['tmp_name'],"./csv/".$nazwa))
  11.            {
  12.                ?>
  13.                <div id=good>
  14.                        <p>Plik wysłany pomyślnie</p>
  15.                        <a href=java script:history.back(-1);>Wstecz</a>
  16.                </div>
  17.                
  18.                
  19.                <?
  20.                $this->dodaj($nazwa);
  21.            }
  22.            else
  23.                {
  24.                    switch($_FILES['plik']['error'])
  25.                    {
  26.                        case 1: echo ('<span id=bad>Przesłany plik jest większy niż zezwala konfiguracja serwera.</span>');
  27.                            break;
  28.                        case 2: echo ('<span id=bad>Przesłany plik jest wiekszy niż zezwala formularz.</span>');
  29.                            break;
  30.                        case 3: echo ('<span id=bad>Przesłano tylko część pliku.</span>');
  31.                            break;
  32.                        case 4: echo ('<span id=bad>Plik nie został przesłany.</span>');
  33.                            break;
  34.                    }
  35.                }
  36.        }
  37.    }
  38.    public function formularz()
  39.    {
  40.        ?>
  41.        <div id=good>Wyślij plik</div>
  42.            <form action=?akcja=upload enctype=multipart/form-data method=post>
  43.            <table>
  44.            <tr><td>Ścieżka pliku: </td><td>
  45.            <input type=file name=plik />
  46.            </td></tr>
  47.            <input type=submit value=Wyślij zdjęcie/>
  48.            </td></tr></table>
  49.            </div>
  50.            <?
  51.    }
  52.    public function dodaj($n)
  53.    {
  54.        
  55.        $row = 1;
  56.        $uchwyt = fopen("csv/".$n,r);
  57.  
  58.  
  59.        while (($data = fgetcsv($uchwyt, 1000, ";")) !== FALSE)
  60.        {
  61.        $num = count($data);
  62.         $row;
  63.        
  64.        $result = $this->_lacz->query('INSERT INTO `probid_auctions` (
  65.  
  66.        `name`, `description`, `quantity`, `auction_type`, `start_price`,
  67.        `buyout_price`,`duration`, `shipping_method`, `shipping_int`,
  68.        `payment_methods`, `category_id`,  `hpfeat`, `catfeat`, `bold`,
  69.        `hl`, `postage_amount`, `insurance_amount`, `type_service`,
  70.        `list_in`, `approved`,
  71.        `auto_relist_nb`,`is_relisted_item`,`start_time`,`start_time_type`,
  72.        `is_draft`,`start_on_bid`,`additional_rows_titles`,`additional_rows_values`
  73.    
  74.        )
  75.        VALUES (
  76.        '.$data[3].', '.$data[12].','.$data[13].','.$data[2].','.$data[14].',                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 '.$data[17].','.$data[23].','.$data[30].','.$data[31].','.$data[37].',
  77.        '.$data[1].','.$data[19].','.$data[20].','.$data[17].','.$data[18].',
  78.        '.$data[32].','.$data[33].','.$data[35].', '.$data[0].','.$data[38].',
  79.        '.$data[29].','.$data[28].','.$data[21].','.$data[21].','.$data[40].',
  80.        '.$data[22].','.$data[4].','.$data[5].')');    
  81.      
  82.        
  83.        }
  84.        fclose($uchwyt);
  85.    }
  86. }
Crozin
Przepraszam za mały offtop: "class upload extends mysql" co ma piernik do wiatraka? W jaki sposób klasa upload rozszerza klasę mysql?
Lejto
ok troche zamotanie, a jak to poprawić?
-=Peter=-
Przekazując obiekt klasy mysql do obiektu klasy upload...

przykładowo:

  1. <?php
  2. class mysql implements Database{}
  3.  
  4.  
  5. class upload{
  6.  private $db;
  7.  
  8.  //ciach  
  9.  
  10.  public function setDb(Database $mysql){
  11.    $this->db = $mysql;
  12.  }
  13.  
  14.  public function getDb(){
  15.    return $this->db;
  16.  }
  17.  
  18.  public function add($v){
  19.    $result = $this->getDb()->query('...');
  20.    //ciach
  21.  }
  22.  
  23. }
  24.  
  25. $upload->setDb($mysql);
  26. $upload->add('blebleble');
  27. ?>


A jeśli chodzi o Twoje konkretne pytanie, to w jakiś cudowny sposób metoda upload (nazwa taka sama jak klasa, a w php4 tak się zwie konstruktor) przysłania konstruktor nadklasy mysql. Zmień nazwę tej metody. Sprawdzałem to teraz i to chyba jest bug, że najpierw jest sprawdzane czy w klasie jest konstruktor o nazwie __construct, jak nie ma to o takiej samej nazwie co klasa, a jak wtedy dopiero nie ma to czy w klasie nadrzędnej jest konstruktor __construct... Wg mnie nieporządane i dziwne działanie, więc kwalifikuję to jako bug tongue.gif
okitoki
poco dziedziczysz po klasie mysql, nie łatwiej stworzyć obiekt mysql i w konstruktorze go przesłać?, w twoim sposobie będziesz generował zbędne połączenia z bazą danych, bo każdy obiekt będzie miał swoje.


nie działa ci to bo zasłoniłeś konstruktora klasy mysql, wszędzie gdzie dziedziczysz po tej klasie w konstruktorze dodaj wpis parent :: __construct()
Lejto
to jak mam sobie klase która ma za zadanie łączenia się z bazą dodaje ją w pliku index.php potem mam 2 klasę która dodaje coś do bazy to żeby nie robić
extends mysql { -,-
to muszę za każdym razem implements Database{}? nie da się inaczej?
@okitoki nie za bardzo cię rozumiem ;/
marcio
Da sie inaczej po co tu w ogole sa potrzebne interfejsy tu masz przyklad jak takie cos zrobic: Temat: user_class__dziedziczenie ostatni post.

A jak nie robisz klase i metody statyczne wtedy nie musisz robic instancji danej klasy jednak jest to zbedne przy klasie dla Mysql bo za kazdym razem bedzie musial tworzyc i zamykac polaczenie.

A jak juz tak bardzo chcesz dziedziczyc to tak jak ci WebCm napisal uzywaj metod z klasy bazowej za pomoca parent::
Lejto
ok dzięki, jakoś sobie poradzę
okitoki
Cytat(Lejto @ 6.05.2009, 12:54:44 ) *
to jak mam sobie klase która ma za zadanie łączenia się z bazą dodaje ją w pliku index.php potem mam 2 klasę która dodaje coś do bazy to żeby nie robić
extends mysql { -,-
to muszę za każdym razem implements Database{}? nie da się inaczej?
@okitoki nie za bardzo cię rozumiem ;/


nie musisz za każdym razem implementować database
tworzysz obiekt

$sql = new mysql(); // on już się łączy z bazą ma tam jakąś metode query

jak chcesz to przekazać do innego obiektu to robisz

$inny_obiekt = new inna_klasa($sql)

a klasa wygląda następująco

Kod
class inna_klasa
{
private $sql;
public function __construct($sql)
  {
    $this->sql = $sql;
  }
}


i w ten oto sposób w 2giej klasie masz zaimplementowanego sql-a.
jak zrobisz poprzez dziedziczenie tak jak na twoim przykładzie to klasa gdzie dziedziczysz musi wyglądać następująco


Kod
class upload extends mysql {
   public function __construct()
   {
     parent::__construct()
   }

    public function dodaj($n)
    {
        
        
        $result = $this->_lacz->query('zapytanie');    
      
        
        }
        fclose($uchwyt);
    }
}
marcio
Kod
public function __construct($sql)
  {
    $this->sql = $sql;
  }

Chyba jednak nie tak jak cos to:
Kod
public function __construct(KlasaSql $sql)
  {
    $this -> sql = $sql;
  }
osl
marcio, a czym różnią się te dwa konstruktory, poza tym że jeden jest bardziej 'strict'?
Działają identycznie przecież...
marcio
Jak moze dzialac skoro nie podajemy klasy z ktorej ma zostac przekazany obiekt?

Jesli dziala to good nie wiedzialem o tym tongue.gif i zwracam honor lecz dziwnie mi to wygladalo.
okitoki
działają good smile.gif, jak określisz klase, to tylko obiekt tej klasy będziesz mógł tam przesłać, jeżeli nie określisz klasy, to tworzysz klasy baza_danych1, baza_danych2, ważne by miały metody i pola te same, w ten sposób możesz działać na różnych silnikach bazodanowych i nie tylko
Lejto
ok dzięki trochę mi się rozjaśniło winksmiley.jpg
ndx
Cytat(osl @ 6.05.2009, 14:05:28 ) *
marcio, a czym różnią się te dwa konstruktory, poza tym że jeden jest bardziej 'strict'?
Działają identycznie przecież...

Zobacz co sie stanie jak $sql nie bedzie instancja KlasaSql tylko np. stringiem
osl
@ndx - zgoda, ale to nie jest aż taki znowu błąd - generalnie w przypadku implementacji takiej klasy wszystko zależy od programisty, więc jeśli tam się pojawi cokolwiek innego niż instancja klasy to znaczy tyle, że gdzieś wcześniej jest błąd.

W żadnym przypadku nie twierdze kod KlasaSql $sql jest błędne, ale po prostu w tym przypadku wszystko powinno być na tyle hermetyczne żeby nic innego się nie pojawiło poza instancją odpowiedniej klasy.
okitoki
Cytat(ndx @ 7.05.2009, 11:19:30 ) *
Zobacz co sie stanie jak $sql nie bedzie instancja KlasaSql tylko np. stringiem


bez znaczenia, czy będzie stricte czy nie będzie błąd jak podepniesz stringa, tyle że na innych liniach i inny błąd exclamation.gif
marcio
Ale wtedy wiadomo ze trzeba podac instancje klasy i nie trzeba analizowac kodu ani rozmyslac.
osl
ależ nikt nie neguje tego, że tak jest lepiej/wygodniej.
Jednakże w Twoim (@marcio) poście widać sugestię, że bez podawania typu jest błędnie, Jest jak najbardziej prawidłowo, jednakże podawanie typu (tak jak i jego sprawdzanie, choć to bardziej uciążliwe) też ma swoje zalety - nie tylko jeżeli chodzi o styl programowania w php, również pomaga w niektórych edytorach (np. NetBeans).

Wystarczyło żebyś zamiast "Chyba jednak nie tak" napisał "Jeszcze lepiej tak". Być może i ja za bardzo się uczepiłem winksmiley.jpg
Wydaje mi się, że nie ma co już się rozwodzić na ten temat smile.gif
okitoki
lejto daj cały kod klas upload i mysql

marcio nie zupełnie jest tak jak piszesz, jak sciśle określisz jakiego typy ma być podany to tylko to będziesz tam mógł podać, lub dziedzica tej klasy, jak już się tak na to uparłeś, to lepiej podać jako typ interface, bo wtedy będzie mogło być wszystko co będzie pochodziło od interfacu. ale uniwersalne i tak dobre a wcale nie miałem z tym takich problemów o jakich piszesz.

Zresztą zawód programisty wymaga odpowiedniego myślenia przy pracy, a nie podawania w parametrach jak leci exclamation.gif
Lejto
ok podam ten w którym nic nie zmieniałem
ps niektóre funkcje pominąłem
  1. <?php
  2. require_once('config.php');
  3.  
  4. class mysql
  5. {
  6.   public $_lacz;
  7.  
  8.   public function __construct()
  9.   {
  10.      $this->_lacz = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  11.  
  12.   }
  13.  
  14. }
  15. ?>

i
  1. <?php
  2. class upload{
  3. //[...]..    
  4. public function dodaj($n)
  5.    {
  6.        
  7.     //[...]..    
  8.          $sql = $this->_lacz->query("zapytanie");    
  9.          
  10.        
  11.        }
  12. //[...]..    
  13. }
  14. ?>
okitoki
jeszcze upload, widzę że pominołeś, i dlatego nie widać co jest nie tak, już teraz widze że nie dziedziczysz po klasie mysql
Lejto
no dodałem upload, tam dalej już nic nie ma tylko funkcja wysyłająca plik i odczytująca to też potrzebne?

cała klasa
  1. <?
  2. class upload{
  3.    
  4.    public function upload()
  5.    {
  6.        if($_SESSION['login'])
  7.        {
  8.        
  9.        $nazwa = $_FILES['plik']['name'];
  10.        
  11.        $nazwapliku1 = explode('.', $nazwa);
  12.        $np = count($nazwapliku1);
  13.        $count = $np -1;
  14.        
  15.        
  16.        if(move_uploaded_file($_FILES['plik']['tmp_name'],"./csv/".$nazwa))
  17.            {
  18.                ?>
  19.                <div id=good>
  20.                        <p>Plik wysłany pomyślnie</p>
  21.                        <a href=java script:history.back(-1);>Wstecz</a>
  22.                        
  23.                </div>
  24.                
  25.                
  26.                <?
  27.                $this->dodaj($nazwa);
  28.            }
  29.            else
  30.                {
  31.                    switch($_FILES['plik']['error'])
  32.                    {
  33.                        case 1: echo ('<span id=bad>Przesłany plik jest większy niż zezwala konfiguracja serwera.</span>');
  34.                            break;
  35.                        case 2: echo ('<span id=bad>Przesłany plik jest wiekszy niż zezwala formularz.</span>');
  36.                            break;
  37.                        case 3: echo ('<span id=bad>Przesłano tylko część pliku.</span>');
  38.                            break;
  39.                        case 4: echo ('<span id=bad>Plik nie został przesłany.</span>');
  40.                            break;
  41.                    }
  42.                }
  43.        }
  44.    }
  45.    public function formularz()
  46.    {
  47.        ?>
  48.        <div id=good>Wyślij plik</div>
  49.            <form action=?akcja=upload enctype=multipart/form-data method=post>
  50.            <table>
  51.            <tr><td>Ścieżka pliku: </td><td>
  52.            <input type=file name=plik />
  53.            </td></tr>
  54.            <tr><td>
  55.            <input type=submit value=Wyślij zdjęcie/>
  56.            </td></tr></table>
  57.            </div>
  58.            <a href="?akcja=haslo">Zmień hasło</a> || <a href="?akcja=out">Wyloguj</a>
  59.  
  60.        <?
  61.    }
  62.    public function dodaj($n)
  63.    {
  64.        if($_SESSION['login'])
  65.        {
  66.        
  67.        $row = 1;
  68.        $uchwyt = fopen("csv/".$n,'r');
  69.        
  70.        $lines  = file("csv/".$n);
  71.        
  72.        $limit = count($lines);
  73.        $GLOBALS['num'] = $limit;
  74.        
  75.        while (($data = fgetcsv($uchwyt, 1000, ";")) !== FALSE)
  76.        {
  77.        $num = count($data);
  78.         $row;
  79.        
  80.      
  81.        
  82.        
  83.        $id1 = serialize(array($data[4],$data[6],$data[8]));
  84.        $id2 = serialize(array($data[5],$data[7],$data[9],$data[11]));
  85.        if($data[38] == 1)
  86.        {
  87.            $is_draft = 0;
  88.        }
  89.        else
  90.        {
  91.            $is_draft  = 1;
  92.        }
  93.    
  94.        
  95.          $sql = $this->_lacz->query("INSERT INTO `probid_auctions` (
  96.  
  97.        `name`, `description`, `quantity`, `auction_type`, `start_price`,
  98.        `buyout_price`,`duration`, `shipping_method`, `shipping_int`,
  99.        `payment_methods`, `category_id`,  `hpfeat`, `catfeat`, `bold`,
  100.        `hl`, `postage_amount`, `insurance_amount`, `type_service`,
  101.        `list_in`, `approved`,
  102.        `auto_relist_nb`,`is_relisted_item`,`start_time`,`start_time_type`,
  103.        `is_draft`,`start_on_bid`,`additional_rows_titles`,`additional_rows_values`
  104.    
  105.        )
  106.        VALUES ('dane')");    
  107.      
  108.        }
  109.        fclose($uchwyt);
  110.        header("Location: index.php?akcja=pokaz");
  111.        }
  112.    }
  113. }
okitoki
Kod
class mysql
{
  public $_lacz;

  public function __construct()
  {
     $this->_lacz = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

  }
  
  public function query($sql)
  {
      return $this->_lacz->query($sql);
  }

}

class upload{
public $sql = null;

public function __construct($sql)
{
    $this->sql = $sql;
}

public function upload()
   {
       if($_SESSION['login'])
       {
      
       $nazwa = $_FILES['plik']['name'];
      
       $nazwapliku1 = explode('.', $nazwa);
       $np = count($nazwapliku1);
       $count = $np -1;
      
      
       if(move_uploaded_file($_FILES['plik']['tmp_name'],"./csv/".$nazwa))
           {
               ?>
               <div id=good>
                       <p>Plik wysłany pomyślnie</p>
                       <a href=javascript:history.back(-1);>Wstecz</a>
                      
               </div>
              
              
               <?
               $this->dodaj($nazwa);
           }
           else
               {
                   switch($_FILES['plik']['error'])
                   {
                       case 1: echo ('<span id=bad>Przesłany plik jest większy niż zezwala konfiguracja serwera.</span>');
                           break;
                       case 2: echo ('<span id=bad>Przesłany plik jest wiekszy niż zezwala formularz.</span>');
                           break;
                       case 3: echo ('<span id=bad>Przesłano tylko część pliku.</span>');
                           break;
                       case 4: echo ('<span id=bad>Plik nie został przesłany.</span>');
                           break;
                   }
               }
       }
   }
   public function formularz()
   {
       ?>
       <div id=good>Wyślij plik</div>
           <form action=?akcja=upload enctype=multipart/form-data method=post>
           <table>
           <tr><td>Ścieżka pliku: </td><td>
           <input type=file name=plik />
           </td></tr>
           <tr><td>
           <input type=submit value=Wyślij zdjęcie/>
           </td></tr></table>
           </div>
           <a href="?akcja=haslo">Zmień hasło</a> || <a href="?akcja=out">Wyloguj</a>

       <?
   }
   public function dodaj($n)
   {
       if($_SESSION['login'])
       {
      
       $row = 1;
       $uchwyt = fopen("csv/".$n,'r');
      
       $lines  = file("csv/".$n);
      
       $limit = count($lines);
       $GLOBALS['num'] = $limit;
      
       while (($data = fgetcsv($uchwyt, 1000, ";")) !== FALSE)
       {
       $num = count($data);
        $row;
      
    
      
      
       $id1 = serialize(array($data[4],$data[6],$data[8]));
       $id2 = serialize(array($data[5],$data[7],$data[9],$data[11]));
       if($data[38] == 1)
       {
           $is_draft = 0;
       }
       else
       {
           $is_draft  = 1;
       }
  
         $db = $this->sql;
         $sql = $db->query("INSERT INTO `probid_auctions` (

       `name`, `description`, `quantity`, `auction_type`, `start_price`,
       `buyout_price`,`duration`, `shipping_method`, `shipping_int`,
       `payment_methods`, `category_id`,  `hpfeat`, `catfeat`, `bold`,
       `hl`, `postage_amount`, `insurance_amount`, `type_service`,
       `list_in`, `approved`,
       `auto_relist_nb`,`is_relisted_item`,`start_time`,`start_time_type`,
       `is_draft`,`start_on_bid`,`additional_rows_titles`,`additional_rows_values`
  
       )
       VALUES ('dane')");    
    
       }
       fclose($uchwyt);
       header("Location: index.php?akcja=pokaz");
       }
   }
}

include_once("db.class.php");
$db = new mysql();
global $db; // zła deklaracja

include("login.class.php");
$log = new Auth();

include("upload.class.php");
$up = new upload($db);
global $up // zła deklaracja


jak działa słowo kluczowe global


Kod
$zmienna = "jakies dane\r\n";

function funkcja1()
{
   global $zmienna;
   $zmienna = "dane zmienione we funkji 1\r\n";
}

function funkcja2()
{
   $zmienna = "jakies inne dane\r\n";
}

echo $zmienna;
funkcja2();
echo $zmienna;
funkcja1();
echo $zmienna;
Lejto
ok dzięki działa dobrze smile.gif
napisałem jeszcze 1 funkcje wywołującą zapytanie znajduje się ona w klasie mysql
  1. <?php
  2. public function set_query($query)
  3.    {
  4.         $rows = array();
  5.        $wykonaj = $this->_lacz->query($query);
  6.    
  7.        while($row = $wykonaj->fetch_row())
  8.        {
  9.            return $row[0];
  10.          }    
  11.                    
  12.     }
  13. ?>

wywołuje ją w klasie upload
  1. <?php
  2. public function tresc_db()
  3.    {
  4.            $db = $this->sql;
  5.            $result = $db->set_query('SELECT tresc from pages where name = glowna');
  6.            echo $result;
  7.    }
  8. ?>

i otrzymuje błąd ;/
Kod
Fatal error: Call to a member function fetch_row() on a non-object in C:\Serv\www\a\db.class.php on line 25

źle coś przekazałem?

a nie sory miałem złe zapytanie tongue.gif
marcio
Cytat
Zresztą zawód programisty wymaga odpowiedniego myślenia przy pracy, a nie podawania w parametrach jak leci

Ale nie polega na tym by sie glowkowac nad cudzym kodem bo komus nie chcialo okreslic sie o jaka instancje klasy chodzi.

Jesli tobie jest tak wygodnie to fajnie ale pierwszy raz widze na tym forum takie przekazywanie obiektow wiec wiesz....
okitoki
mnie OOP zaraził kolega w 2000 roku, pokazał mi jego zalety, w PHP stosuje go może od 5 lat, w PHP4 tam robiłem drobne klasy, ale to nie było OOP, w PHP5 już to lepiej przypomina obiektowość. PHP ma tą zaletę że nie wymaga określenia typu zmiennej, wiec poco utrudniać sobie życie, a tak jest w innych językach.

A o gościu co mnie tym zaraził mogę powiedzieć że jest mózgiem informatycznym, pare lat temu napisał swój system operacyjny (nie opierał się na linux-ie) i stworzył do niego kompilator. obecnie pracuje w jakiejś firmie amerykańskiej w Polsce, tworzą oprogramowanie dla NASA
ndx
Cytat(okitoki @ 8.05.2009, 08:40:18 ) *
mnie OOP zaraził kolega w 2000 roku, pokazał mi jego zalety, w PHP stosuje go może od 5 lat, w PHP4 tam robiłem drobne klasy, ale to nie było OOP, w PHP5 już to lepiej przypomina obiektowość. PHP ma tą zaletę że nie wymaga określenia typu zmiennej, wiec poco utrudniać sobie życie, a tak jest w innych językach.

A o gościu co mnie tym zaraził mogę powiedzieć że jest mózgiem informatycznym, pare lat temu napisał swój system operacyjny (nie opierał się na linux-ie) i stworzył do niego kompilator. obecnie pracuje w jakiejś firmie amerykańskiej w Polsce, tworzą oprogramowanie dla NASA


Taa, pewnie napisał swoje libc...
okitoki
Cytat(ndx @ 8.05.2009, 15:22:14 ) *
Taa, pewnie napisał swoje libc...


a co to wymagana biblioteka, w każdym systemie czy w każdym kompilatorze

kompilatora parsuje i kompiluje z języka przypominającego paskala, generuje z niego plik binarny taki jak assembler, idea tego nie była taka by z tego korzystały miliony, tylko by komputer uruchomić i zaprogramować (od podstaw)
Lejto
jak includuje jeszcze klasę w index.php to wszystko ok
ale w switchu mam includowany plik galeria.php a nim dołączam klase
  1. <?php
  2. include("galeria.class.php");
  3. $g = new galeria($db);
  4. ?>

odpalam plik galeria przez index i zwraca mi błąd w postaci braku obiektu ;/ dlaczego?
pejott
Ey, z tego co wiem i stosuję, to właśnie trzeba sprawdzać jaką klasę reprezentuje przekazywany obiekt.
Co jeśli ktoś się rypnie w kodzie i przekaże nie tą zmienną ?
okitoki
no nie zadziała, wysypie się błąd, tak można robić jak coś dynamicznie ładujesz, i to nawet nie ty, tylko kowalski może dopisać coś do twojego skryptu.

a tak to nie ma znaczenia czy podasz czy nie podasz, bo i tak się pojawi błąd jak podasz to PHP ci powie że zły podałeś i oczekuje innego
jak nie podasz, to PHP ci powie że np. nie ma takiego pola czy metody
pejott
Tak, ale gdy zastosujemy sprawdzenie przez wpisanie nazwy klasy przed argumentem, to wysypie nam czego oczekuje.
Poza tym, to chyba po to wymyślono takie rozwiązanie i z powodzeniem stosuje się je w Symfony i ZF.
Można również użyć instanceof. Na przykład.

  1. <?php
  2. ...
  3.  
  4. public function setRequest($objRequest) {
  5.  
  6.    if( $objRequest instanceof Request ) { ... } else { throw new Exception(...); }
  7.  
  8. }
  9.  
  10. ...
  11.  
  12. /* W tym wypadku wyspie normalny błąd, ja wole rzucać wyjątkiem. */
  13.  
  14. ...
  15.  
  16. public function setRequest(Request $objRequest) {
  17.  
  18.    ...
  19.  
  20. }
  21.  
  22. ...
  23. ?>


Zdecydowanie bardziej elegancko i moim zdaniem lepiej.

Pozdrawiam.
Lejto
no ok ale co mam zrobić z moją klasą którą dodaje? instanceof?
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.