sportowe - imprezy integracyjne - oprogramowanie dla cukierni - cięcie plazmowe - Turystyka Dodaj Obiekt - Domy Chorwacja - fotki - Gry - ALFA INSTRUKCJA NAPRAWY - pompy ciepła

Bezpłatny kurs programowania w PHP.

Krok po koroku, pełna dokumentacja w języku polskim. Skrypty napisane w PHP są z reguły umieszczane w dokumentach tekstowych (często razem z HTML lub XHTML). Dzięki temu PHP jest podobny w założeniach do dużo starszego mechanizmu Server Side Includes[4]. PHP pozwala także na wykonywanie skryptów z linii poleceń podobnie jak Perl i Python. Jego modułowa budowa udostępnia również możliwość programowania aplikacji z interfejsem graficznym. PHP umożliwia współpracę z wieloma rodzajami źródeł danych, jak na przykład serwery relacyjnych baz danych, pliki tekstowe czy dokumenty XML.

Referencje wewnÄ…trz konstruktora

Referencje wewnÄ…trz konstruktora

Tworzenie referencji wewnątrz konstruktora może prowadzić do dziwnych efektów. Ten rozdział ma pomóc w unikaniu takich problemów.

<?php
class Foo {
    function
Foo($nazwa) {
        
// stworz referencje wewnatrz globalnej tablicy $globalref
        
global $globalref;
        
$globalref[] = &$this;
        
// ustaw nazwę na przekazaną wartość
        
$this->ustawNazwe($nazwa);
        
// i wyświetl ją
        
$this->wyswietlNazwe();
    }

    function
wyswietlNazwe() {
        echo
"<br />",$this->nazwa;
    }
    
    function
ustawNazwe($nazwa) {
        
$this->nazwa = $nazwa;
    }
}
?>

Sprawdźmy, czy jest jakaś różnica pomiędzy $bar1, który jest tworzony przy pomocy operatora przypisania =, a $bar2, który został stworzony używając operatora referencji =&...

<?php
$bar1
= new Foo('ustawione w konstruktorze');
$bar1->wyswietlNazwe();
$globalref[0]->wyswietlNazwe();

/* wyjście:
ustawione w konstruktorze
ustawione w konstruktorze
ustawione w konstruktorze */

$bar2 =& new Foo('ustawione w konstruktorze');
$bar2->wyswietlNazwe();
$globalref[1]->wyswietlNazwe();

/* wyjście:
ustawione w konstruktorze
ustawione w konstruktorze
ustawione w konstruktorze */
?>

Wydaje się, że nie ma żadnej różnicy, ale na prawdę jest jedna, i to bardzo istotna: $bar1 i $globalref[0] NIE są referencjami, NIE są tą samą zmienna. Dzieje się tak, ponieważ "new" nie zwraca domyślnie referencji, ale kopię.

Notatka: Zwracanie kopii zamiast referencji nie powoduje utraty wydajności (od PHP 4 używane jest zliczanie referencji). Jednakże zazwyczaj lepiej jest pracować poprostu z kopiami zamiast referencji, poniewać tworzenie referencji zabiera trochę czasu, podczas gdy tworzenie kopii obiektów teoretycznie w ogóle nie zabiera czasu (chyba że któraś z tych zmiennych jest dużą tablicą lub obiektem i jedno z nich ulega zmianie, po czym tej samej zmianie ulegają pozostałe zmienne; wtedy lepiej jest użyć referencji do zmieniania ich równolegle).

Aby udowodnić to, co zostało zapisane powyżej, przyjrzyjmy się poniższemu programowi.

<?php
// teraz zmienimy nazwÄ™. czego siÄ™ spodziewasz?
// możesz się spodziewać, że i $bar1 i $globalref[0] zmienią swoje nazwy...
$bar1->ustawNazwe('ustawiona z zewnÄ…trz');

// jak napisano powyżej, nic takiego się nie stanie
$bar1->wyswietlNazwe();
$globalref[0]->wyswietlNazwe();

/* wyjście:
ustawiona z zewnÄ…trz
ustawiona w konstruktorze */

// zobaczmy co siÄ™ dzieje z $bar2 i $globalref[1]
$bar2->ustawNazwe('ustawiona z zewnÄ…trz');

// na szczęście ta zmienna nie zachowuje się jak ta z poprzedniego przypadku
// są to te same zmienne, z więc $bar2->nazwa i $globalref[1]->nazwa są także
// tymi samymi zmiennymi
$bar2->wyswietlNazwe();
$globalref[1]->wyswietlNazwe();

/* wyjście:
ustawiona z zewnÄ…trz
ustawiona z zewnÄ…trz */
?>

Ustatni przykład. Postaraj się go zrozumieć/

<?php
class A {
    function
A($i) {
        
$this->wartosc = $i;
        
// domyśl się dlaczego nie potrzebujemy tutaj referencji
        
$this->b = new B($this);
    }

    function
stworzRef() {
        
$this->c = new B($this);
    }

    function
wyswietlWartosc() {
        echo
"<br />","klasa ",get_class($this),': ',$this->value;
    }
}


class
B {
    function
B(&$a) {
        
$this->a = &$a;
    }

    function
wyswietlWartosc() {
        echo
"<br />","klasa ",get_class($this),': ',$this->a->value;
    }
}
// spróbuj zrozumieć dlaczego użycie tu prostego kopiowania może powodować
// nieporzÄ…dany efekt w linii uznaczonej znaczkiem '*'
$a =& new A(10);
$a->stworzRef();

$a->wyswietlWartosc();
$a->b->wyswietlWartosc();
$a->c->wyswietlWartosc();

$a->value = 11;

$a->wyswietlWartosc();
$a->b->wyswietlWartosc(); // *
$a->c->wyswietlWartosc();

?>

Powyższy przykład wyświetli:

klasa A: 10
klasa B: 10
klasa B: 10
klasa A: 11
klasa B: 11
klasa B: 11

php

kontakt:praca.pozycjonowanie@gmail.com

Design by flankerds
sylwester viagra sylwester obozy m³odzie¿owe milf lessons