Forum poświęcone PHP
Mam taki kod: class A { }; class B : public A { }; Czy da się zrobić tak, aby w programie nie można było utworzyć obiektu klasy A?
Sun,04 Jan 2009 01:42:01 +0100
witam mam banalny problem ale jakos nie potrafie sobie z nim poradzic [glowa] [wstyd] chodzi o to, ze w programie mam wyszukiwanie w czasie rzeczywistym: jak tylko zaczynam cos wpisywac do edita to wyszukiwane sa odp rzeczy. problem w tym, ze jesli wyszukiwanie trwa a ja cos zmienie w edicie to wyszukiwanie ma zostac przerwane a nast rozpoczete na nowo. no i wlasnie z tym mam problem, z zatrzymaniem i jednoczesnym rozpoczeciem nowego. help [glowa] dzieki z gory
Sun,04 Jan 2009 01:23:45 +0100
Witam :) Chciałbym prosić o pomoc w rozpracowaniu kodu programu. Jest to saper napisany poprzez tablice dwuwymiarowe, których wartości ja zdefiniowane globalnie. Program znalazłem w zwykłym C i przerobiłem go na polskie określenia oraz na język c++. Powyrzucałem też nieco zbędnych linijek kodów zastępując łatwiejszymi rozwiązaniami oraz wprowadziłem generator losowych bomb ;) Generalnie rzecz biorąc rozumiem co nieco funkcji, ale chciałbym się upewnić co do moich domysłów. #include "stdafx.h" #include #include #include #include using namespace std; const int lw=7; const int lk=7; const int lb=1; int tab_bomb[lw][lk]; int tab_krycie[lw][lk]; int otoczenie_bomb[lw][lk]; int pozostale_pola; int Zaleznosc(int wiersz, int kolumna) //do sprawdzenia poprawnosci wprowadzonych wspolrzednych { return wiersz>=0 && wiersz=0 && kolumna
Sun,04 Jan 2009 01:14:49 +0100
Mam mały problem, tworzę dynamicznie tablice dwuwymiarowa char i chcę do niej wpisywać wyrazy gdzie w każdym wierszu będzie inny, a gdy wcisnę 0 to się wpisywanie zakończy. Ilości wyrazów jakie zostaną wpisane do tablicy nie znam więc używam zmiennej ilosc_wyrazow jako licznika ich. I mój problem jest następujący nie wiem gdzie wsadzić licznik wyrazów aby je zliczał oraz aby dobrze się tekst kopiował do tablicy dwuwymiarowej z tablicy pomocniczej. #define DLUGOSC_WIERSZA 50 int ilosc_wyrazow = 1 ; char tab_pomocnicza[50] ; tablica = (char**)malloc(DLUGOSC_WIERSZA * sizeof(char*)); for(i = 0; i < DLUGOSC_WIERSZA; ++i) { tablica[i] = (char*)malloc(ilosc_wyrazow * sizeof(char)); scanf("%s", tab_pomocnicza) ; if(tab_pomocnicza[0] == '0') { break ; } strcpy(tablica[i], tab_pomocnicza) ; } Jak narazie doszedłem do tego i kod mi wybucha, w grę wchodzi tylko ANSI C
Sun,04 Jan 2009 01:12:31 +0100
Problem to pewnie wina złych pomysłów... Ale w skrócie, mam klasę bazową będącą teoretycznie robolem oraz klase niby interfejsu wyższego poziomu. Obie te klasy to szablony. Trudno opisać cały ten bałagan, w każdym razie kod przykładowy wygląda tak: template class BaseW { protected: T work(T a, T b) { /*tu żyją smoki*/}; public: BaseW(){/*tu składają jaja smoki*/}; ~BaseW(){/*tu giną smoki*/}; } template Class WHorse: private BaseW { protected: typedef T (BaseW::*wrk)(T,T); map workers; public: WHorse() { workers['a']=BaseW::work; //
Sun,04 Jan 2009 00:00:25 +0100
Rozdział 18. Klasy i obiekty (PHP 4)
klasa
Klasa jest to zbiór zmiennych i funkcji operujących na tych zmiennych. Do definicji klasy używana jest następująca składnia:
<?php |
Definiuje to klasę o nazwie Koszyk, która zawiera tablicę asocjacyjną artykułów znajdujących się w wózku i dwie funkcje do dodawania i usuwania produktów z koszyka.
| Ostrzeżenie |
NIE jest możliwe rozbicie definicji klasy na wiele plików. Także NIE jest możliwe rozbicie definicji klasy na wiele bloków PHP, chyba że rozbicie to znajduje się wewnątrz definicji metody. Poniższy kod nie będzie działać.
Jednakże poniższy kod jest dozwolony:
|
Poniższe uwagi dotyczą PHP 4.
| Uwaga! |
Nazwa stdClass jest używana wewnętrznie przez Zend i jest zarezerwowana. W PHP nie możesz zdefiniować klasy o nazwie stdClass. |
| Uwaga! |
Nazwy funkcji __sleep i __wakeup mają magiczne znaczenie dla klas w PHP. Klasy nie mogą zawierać funkcji o tych nazwach, chyba że zgadzasz się na przypisanie do nich magicznej funkcjonalności. Poniżej możesz znaleźć więcej informacji. |
| Uwaga! |
PHP rezerwuje wszystkie nazwy funkcji zaczynające się od __ na funkcje magiczne. Zalecane jest nieużywanie funkcji z nazwami zaczynającymi się od __ chyba że chcesz jakiejś magicznej funkcjonalności. |
W PHP 4 dozwolone są tylko stałe inicjalizatory zmiennych var. Aby zainicjalizować zmienne z nie-stałymi wartościami, potrzebujesz funkcję inicjalizacyjną, która jest wywoływana automatycznie zaraz po utworzeniu obiektu z danej klasy. Taka funkcja zwana jest konstruktorem (zobacz poniżej).
<?php |
Klasy są typami, które są w zasadzie tylko schematami dla właściwych zmiennych. Zmienne pożądanego typu musisz stworzyć korzystając z operatora new.
<?php |
Kod ten tworzy obiekty $koszyk i
$inny_koszyk, oba klasy Koszyk. Funkcja dodaj_produkt()
obiektu $koszyk zostaje wywołana w celu dodania 1
artykułu typu "10" do koszyka $koszyk. 3 przedmioty
typu "0815" dodawane są do koszyka $inny_koszyk.
I $koszyk i $inny_koszyk mają
funkcje dodaj_produkt(), usun_produkt() i zmienne. Są to osobne funkcje i
zmienne. Obiekty mogą być postrzegane jako katalogi w systemie plików. W
systemie plików możesz mieć dwa różne pliki
README.TXT, ale tylko jeśli istnieją w osobnych
katalogach. Aby odczytać plik, będąc w głównym katalogu, musisz podać
pełną ścieżkę do tego pliku. Tak samo jest przy obiektach: musisz podać
pełną nazwę funkcji, z której chcesz skorzystać. W terminologii PHP
katalogiem głównym będzie globalna przestrzeń nazw a separatorem ścieżki
będzie ->. W związku z tym nazwy $koszyk i $inny_koszyk zawierają
zupełnie inne zmienne. Zauważ, że zmienna nazywa się
$koszyk->artykuly, a nie
$koszyk->$artykuly, ponieważ nazwa zmiennej może
zawierać tylko jeden znak dolara.
<?php |
Wewnątrz definicji klasy, nie wiesz pod jaką nazwą obiekt będzie dostępny
dla twojego programu: w momencie pisania klasy Koszyk, nie było wiadomo,
czy obiekty będą się nazywać $koszyk,
$inny_koszyk, lub inaczej. W związku z tym nie możesz napisać
$koszyk->artykuly wewnątrz klasy Koszyk. Zamiast
tego, aby uzyskać dostęp do funkcji i zmiennych zawartych w klasie, można
użyć pseudo-zmiennej $this, która może być odczytana jako 'moje własne'
lub 'bieżący obiekt'. A więc
'$this->artykuly[$nrart] +=
$liczba' może być odczytane jako 'dodaj
$liczba do licznika $nrart z mojej
własnej tablicy artykuly' lub 'dodaj $liczba do
licznika $nrartz tablicy artykuly zawartej w bieżącym
obiekcie'.
Notatka: The
$thispseudo-variable is not usually defined if the method in which it is hosted is called statically. This is not, however, a strict rule:$thisis defined if a method is called statically from within another object. In this case, the value of$thisis that of the calling object. This is illustrated in the following example:
<?php
class A
{
function foo()
{
if (isset($this)) {
echo '$this is defined (';
echo get_class($this);
echo ")\n";
} else {
echo "\$this is not defined.\n";
}
}
}
class B
{
function bar()
{
A::foo();
}
}
$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
?>Powyższy przykład wyświetli:
$this is defined (a) $this is not defined. $this is defined (b) $this is not defined.
Notatka: Istnieje kilka przyjemnych funkcji do obsługi klas i obiektów. Możesz je zobaczyć w rozdziale Funkcje obsługi klas i obiektów.
| Poprzedni | Spis treści | Następny |
| Wewnętrzne (wbudowane) funkcje | Początek rozdziału | extends |