Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] dostaję warning, dlaczego?
Forum PHP.pl > Forum > PHP > Object-oriented programming
john_doe
witajcie,

plik prostej klasy

  1. <?php
  2.    
  3. class totoLotto
  4. {
  5.    public $wylosowana = array();
  6.    var $tmp;
  7.    
  8.    public function setTmp()
  9.    {
  10.        $this -> tmp = $tmp;
  11.    }
  12.  
  13.    public function setWylosowane()
  14.    {
  15.        $this -> wylosowana = $wylosowana;
  16.    }
  17.    
  18.    public function losujLiczby()
  19.    {        
  20.        $i = 0;
  21.        while( $i <= 5 )
  22.        {
  23.            $this -> tmp = rand(1,10);
  24.            if( !in_array( $this -> tmp, $this -> wylosowana ) )
  25.            {
  26.                $this -> wylosowana[$i] = $this -> tmp;
  27.                $i++;
  28.            }
  29.        }
  30.    }
  31.    
  32.    public function wypiszWylosowaneLiczby()
  33.    {
  34.        for($i = 0 ; $i <= 5 ; $i++)
  35.        {
  36.            print $i . ' - ' . $this -> wylosowana[$i] . '<br />';
  37.        }    
  38.    }
  39.    
  40. }
  41.  
  42. ?>


oraz index

  1. <?php
  2. include('_class.php');
  3.  
  4. $kcLotto = new totoLotto;
  5.  
  6. $kcLotto -> setWylosowane();
  7. $kcLotto -> losujLiczby();
  8. $kcLotto -> wypiszWylosowaneLiczby();
  9.  
  10.  
  11.  
  12. ?>

Warning: in_array() [function.in-array]: Wrong datatype for second argument in C:wampwwwoopkcLotto_class.php on line 24

proszę ogólnie o opinie na temat tego kodu. Jestem samoukiem. Chciałbym dobrze zacząć.
Ogólnie to coś działa ale najpierw wywala mi warninga sad.gif

pozdrawiam
mike
Przeczytaj najpierw co zwraca funkcja rand() a czego w argumentach oczekuje in_array().

Przenoszę na Przedszkole.
john_doe
taki testowy kod działa
  1. <?php
  2.  
  3. $tab = array(1,2,3);
  4.  
  5. $losowa = rand(1,3);
  6.  
  7. if(in_array($losowa, $tab))
  8.    echo 'znalazlem ' . $losowa;
  9. else echo 'nie znalazlem';
  10.  
  11. ?>


in_array zwraca wartość "boolową"
mike
in_array() zakłada, że przekażesz element tablicy i tablcię. I w teście faktycznie tak robisz.
A w poprzednim przykładzie? Sprawdzasz istnienie elementu $this->tmp w tablicy $this->wylosowana. Tylko czy na pewno to jest tablica? Nie.
john_doe
Mike zobacz na początku klasy mam
public $wylosowana = array();
co tu jest nie tak?
mike
A co masz później? W wywołaniu.
$kcLotto->setWylosowane();

Poza tym metody totoLotto::setTmp() i totoLotto::setWylosowane() są pozbawione sensu.
Obie wywalą komunikat Notice: Undefined variable. W pierwszym przypadku korzystasz ze zmiennej $tmp, której nie ma a w drugim jest to $wylosowana. Zmienne te powinny przyjść do metod jako argumenty.
john_doe
dziekuje Mike. racja. Pływam w OOP ale podoba mi sie smile.gif


w sumie na końcu dodałem to wywołanie. Chyba tego do końca nie rozumiem. ubzdurałem sobie, że każdą zmienna zwykła czy tablicową muszę zainisjować poprzez właśnie taką funkcję "set".

czyli moge robić tak: questionmark.gif?
np.
public $zmienna;

a potem odwoływać się do niej $this -> zmienna;

myślałem że funkcja set pozwoli mi dopiero na takie odwoływanie się bez $ smile.gif
może to głupie ale ucze się OOP.

jeszcze raz dzięki



pozdrawiam.
mike
Cytat(john_doe @ 6.01.2009, 22:08:42 ) *
może to głupie ale ucze się OOP.
Uczenie się to zachowanie dalekie od głupiego. Nikt nie rodzi się z umiejętnością programowania obiektowego.
Zresztą każdy uczy się całe życie. Ja dla przykładu siedzę teraz i też się uczę i pewnie popełniam błedy porównywalne do Twoich.

Przenoszę z powrotem na OOP. Bo jednak faktycznie tu masz problemy.
john_doe
Mike a czy byłby sens gdybym zmienne tmp i wylosowana powołał do życia w konstruktorze?
function __construct()
{
$this -> zmienna = $zmienna;
$this -> wylosowana = $wylosowana;
}
czy w ogóle nie ma takiej potrzeby...

Możesz mi tylko jeszcze zobrazować o co chodzi z tymi ::
questionmark.gif?
wrzasq
Potrzeby sam sobie określasz. Ale to, co ty ciągle robisz, już ci wytknął mike. Taka metoda jaką ty przed chwilą napisałeś jest bez sensu (może się przyzwyczailes do globali?). Ty tych zmiennych po prostu nie masz, więc co chcesz przypisać?

  1. <?php
  2. public function __construct($zmienna, $wylosowana)
  3. {
  4.    $this->zmienna = $zmienna;
  5.    $this->wylosowana = $wylosowana;
  6. }
  7. ?>


Tak jeśli już musisz (aczkolwiek w tym wypadku używanie setTmp() i setWylosowane() będzie chyba odpowiedniejsze niż robienie wszystkiego w konstruktorze.

O :: sobie poczytaj w manualu, nosz proszę, podstaw to jednak sam powinieneś chociaż próbować poszukać.
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.