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
Łańcuchy znaków (string)
Typ string oznacza łańcuch znaków. W PHP znak jest tym sam co bajt, co oznacza, że jest możliwych 256 różnych znaków. Oznacza to także, że PHP nie posiada żadnej wbudowanej obsługi Unikodu.
Notatka: Nie ma technicznych problemów, które utrudniałyby tworzenie bardzo długich ciągów znaków. Nie ma też ustalonej maksymalnej długości łańcuchów znaków obsługiwanych w PHP, więc nie ma powodu do obaw, że dany łańcuch jest zbyt długi.
Składnia
Łańcuch znaków można utworzyć na trzy sposoby.
Pojedyncze cudzysłowy
Najprostszym sposóbem na zdefiniowanie prostego łańcucha znaków, jest umieszczenie go w pojedynczych cudzysłowach (znak ').
Aby w takim łańcuch umieścić symbol pojedynczego cudzysłowu, należy go poprzedzić ukośnikiem wstecznym (\), tak jak w wielu innych językach programowania. Jeśli ukośnik wsteczny ma wystąpić przed symbolem pojedynczego cudzysłowu lub na końcu łańcucha, wtedy należy napisać go dwukrotnie. W przypadku użycia ukośnika wstecznego z innym znakiem, ukośnik też zostanie wyświetlony! Nie ma zatem potrzeby pisania ukośnika dwukrotnie w innych sytuacjach.
Notatka: W PHP 3, ostrzeżenie na poziomie E_NOTICE zostanie wyświetlone, jeśli zajdzie powyższa sytuacja.
Notatka: W przeciwieństwie do dwóch pozostałych składni, zmienne nie będą zamienione na swoje wartości, kiedy pojawią się pomiędzy pojedynczymi cudzysłowami.
echo 'przykładowy tekst'; |
Podwójne cudzysłowy
Kiedy łańcuch znaków jest umieszczony pomiędzy podwójnymi cudzysłowami, PHP interpretuje więcej sekwencji cytowania dla znaków specjalnych:
Tabela 11-1. Znaki cytowane (specjalne)
| sekwencja | znaczenie |
|---|---|
| \n | nowa linia (LF lub 0x0A (10) w ASCII) |
| \r | powrót karetki (CR lub 0x0D (13) w ASCII) |
| \t | tabulacja pozioma (HT lub 0x09 (9) w ASCII) |
| \\ | odwrotny ukośnik |
| \$ | znak dolara |
| \" | cudzysłów podwójny |
| \[0-7]{1,3} | sekwencja znaków pasująca do powyższego wyrażenia regularnego daje znak zapisany w notacji ósemkowej |
| \x[0-9A-Fa-f]{1,2} | sekwencja znaków pasująca do powyższego wyrażenia regularnego daje znak zapisany w notacji szesnastkowej |
Tak jak w poprzedniej składni, zapisanie ukośnika wstecznego przed każdym innymi znakiem spowoduje wyświetlenie zarówno ukośnika, jak i znaku.
Ale najważniejszą właściwością podwójnych cudzysłowów jest to, że zapisane w nich zmienne zostaną zamienione na ich wartości. Więcej informacji w rozdziale parsowanie łańcuchów znaków.
Składnia Heredoc
Jeszcze jednym sposobem na zapisanie łańcucha znaków jest użycie skladni heredoc ("<<<"). Po operatorze <<< powinno się umieścić identyfikator i takim samym identyfikatorem trzeba zakończyć łańcuch znaków.
Identyfikator zamykający musi zaczynać się w pierwszej kolumnie nowej linii. Identyfikator musi też podlegać regułom nazewnictwa w PHP: musi się składać wyłącznie z alfanumerycznych znaków oraz znaku podkreślenia i musi zaczynać się od litery lub znaku podkreślenia.
| Ostrzeżenie |
Ważne by pamiętać, że linia zawierająca identyfikator zamykający nie może zawierać żadnych innych znaków, z wyjątkiem średnika (;). Znaczy to przede wszystkim, że identyfikator zamykający nie może być wcinany, i nie może być żadnych spacji ani tabulacji przed lub za średnikiem. Najbardziej dokuczliwym ograniczeniem jest to, że wewnątrz tego łańcucha znaków nie może być znaku powrotu karetki (\r) na końcu linii, jedynie znak nowej linii (\n). Ponieważ Microsoft Windows używa jako znaku końca linii sekwencji \r\n, łańcuchy znaków zapisne w składni heredoc mogą nie działać, jeśli skrypt zostanie napisany w edytorze windowsowym. Na szczęście większość edytorów tekstowych udostępnia możliwość zapisania pliku w uniksowym formacie końca linii. |
Składnia heredoc zachowuje się podobnie jak tekst w cudzysłowach podwójnych. Oznacza to też, ze nie ma potrzeby cytowania cudzysłowów w tej składni, ale nadal można używać znaków cytowanych, opisanych powyżej. W tej składni nazwa zmiennej zamieniana jest na jej wartość, ale należy zachować ostrożność przy zapisie złożonych zmiennych razem z tekstem.
Notatka: Obsługa składni heredoc została dodana w PHP 4.
Parsowanie zmiennych
Kiedy łańcuch znaków jest zapisany w cudzysłowach podwójnych lub w składni heredoc, zawarte w nim nazwy zmiennych są parsowane, tzn. zamieniane na ich wartości.
Są dwa rodzaje składni, prosta i złożona. Składnia prosta jest najbardziej popularna i najwygodniejsza, pozwala na parsowanie zmiennej, wartości z tablicy oraz właściwości obiektu.
Składnia złożona pojawiła się w PHP 4, i można ją rozpoznać po nawiasach klamrowych, otaczających wyrażenie.
Składnia prosta
Jeśli wewnątrz zmiennej pojawi się znak dolara ($), parser pobierze tyle znaków, ile tylko się da, aby utworzyć poprawną nazwę zmiennej. Aby jawnie określić koniec nazwy zmiennej, należy ją zapisać w klamrach.
$beer = 'Heineken'; |
Podobnie działa parsowanie elementu tablicy lub właściwości obiektu. Dla tablic, prawy nawias prostokątny (]) oznacza koniec indeksu. Dla właściwości obiektu obowiązują te same reguły jak dla zwykłych zmiennych, jednak nie działają tu opisane powyżej sztuczki ze zmiennymi.
$owoce = array( 'truskawka' => 'czerwona' , 'banan' => 'żółty' ); |
Do wyrażeń bardziej skomplikowanych należy używać składni złożonej.
Składnia złożona
Nazwa tej składni nie pochodzi od skomplikowanego zapisu, tylko od możliwości obsługi bardziej złożonych wyrażeń.
Za pomocą tej składni można umieszczać w łańcuchach znaków każdą wartość istniejącą w przestrzeni nazw. Odpowiednie wyrażenie pisze się tak, jakby miało ono znajdować się gdziekolwiek poza łańcuchem znaków, a potem tylko umieszcza się je między { i }. Ponieważ nie można cytować "{", składnia ta będzie prawidłowo rozpoznana tylko wtedy, kiedy $ znajduje się bezpośrednio za {. (Użyj "{\$" lub "\{$" aby uzyskać "{$"). Poniżej kilka przykładów:
$fajne = 'fantastyczne'; |
Indeksowanie łańcucha (ofsety)
Dostęp do pojedynczego znaku łańcucha jest możliwy po podaniu jego indeksu (ofsetu) w nawiasach klamrowych, zaraz po nazwie zmiennej. Pierwszy znak w łańcuchu ma indeks zero.
Notatka: Dla zachowania kompatybilności wstecznej, nadal można używać nawiasów kwadratowych, jednak składnia ta w PHP 4 uznana jest za przestarzałą.
Przykład 11-3. Przykłady używania łańcuchów znaków
|
Przydatne funkcje i operatory
Łańcuchy znaków łączy się za pomocą operatora '.' (kropka). Proszę pamiętać, że operator dodawania '+' nie wykonuje operacji łączenia łańcuchów. Więcej informacji w rozdziale operatory łańcuchowe.
PHP posiada mnóstwo funkcji operujących na łańcuchach znaków.
Najwięcej na ten temat w rozdziale funkcje łańcuchowe. Poza tym obsługiwane są wyrażenia regularne dla potrzeb zaawnsowanych operacji znajdź i zamień (w dwóch odmianach: Perl oraz POSIX extended).
Są także funkcje obsługi łańcuchów URL, jak również funkcje szyfrowania i deszyfrowania łańcuchów (mcrypt oraz mhash).
Jeśli nadal nie znalazłeś tego, czego potrzebujesz, być może pomogą ci funkcje kontroli typu znaków.
Konwersja łańcuchów znaków
Jeśli łańcuch znaków jest konwertowany na postać liczbową, rezultat konwersji będzie zależał od poniższych czynników.
Łańcuch zostanie skonwertowany do typu float, jeśli zawiera znaki ".", "e" lub "E". W przeciwnym razie zostanie skonwertowany do typu integer.
Wartość liczbowa łańcucha znaków zależy od pierwszych znaków tego łańcucha. Jeśli łańcuch zaczyna się od poprawnej wartości liczbowej, wartość ta będzie używa przy konwersji. W przeciwnym razie zwrócona będzie wartość 0 (zero). Poprawna wartość liczbowa zaczyna się od opcjonalnego znaku, po którym znajduje się jedna, lub kilka cyfr (opcjonalnie zawierające przecinek dziesiętny), po którym opcjonalnie znajduje się eksponent. Eksponent jest to znak "e" lub "E", po którym następuje jedna, lub więcej cyfr.
Kiedy pierwszym wyrażeniem jest łańcuch znaków, typ zmiennej będzie zależał od drugiego wyrażenia.
$foo = 1 + "10.5"; // $foo jest typu float (11.5) |
Więcej informacji na temat tej konwersji znajduje się w podręczniku Uniksa, na stronie polecenia strtod(3).
Jeśli chciałbyś przetestować któryś z przykładów w tym rozdziale, możesz je skopiować i wkleić, a następnie dodać poniższą linię i obserwować rezultaty.
| Poprzedni | Spis treści | Następny |
| Liczby zmiennoprzecinkowe (float) | Początek rozdziału | Tablice (array) |