Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][HTML]Nauka PHP
Forum PHP.pl > Forum > Przedszkole
art_php
Hej,
Przepisałem o to taki kod z jednej książek poświęconej programowaniu w PHP w ramach nauki PHP, jednak nie rozumiem pewnych bloków kodu:
CODE
<?php
class Strona
{
//atrybuty klasy Strona
public $zawartosc;
public $tytul='TLA Consulting';
public $przyciski=array('Strona glowna'=>'glowna.php',
'Kontakt' =>'kontakt.php',
'Uslugi' =>'uslugi.php',
'Mapa Strony' =>'mapa.php'
);
//operacja klasy Strona
public function __set($nazwa,$wartosc)
{
$this->$nazwa=$wartosc;
}
public function Wyswietl()
{
echo "<html>\n<head>\n";
$this->WyswietlSlowaKluczowe();
$this->WyswietlStyle();
echo"</head>\n<body>\n";
$this->WyswietlNaglowek();
$this->WyswietlMenu($this->przyciski);
echo $this->zawartosc;
$this->WyswietlStopke();
echo "</body>\n</html>\n";
}

public function WyswietlTytul()
{
echo "<title>$this->tytul</title>";
}

public function WyswietlSlowaKluczowe()
{
echo "<meta name=\"keywords\" content=\"".htmlentities($this->slowa_kluczowe),"\" />";
}
public function WyswietlNaglowek()
{
?>
<table width="100%" cellpading="12" cellspacing="0" border="0">
<tr bgcolor="black">
<td align="left"><img src="logo.gif" /></td>
<td>
<h1>TLA Consulting</h1>
</td>
<td align="right"><img src="logo.gif" /></td>
</tr>
</table>
<?
}
public function WyswietlMenu($przyciski)
{
echo "<table width='100%' bgcolor='white' cellpadding='4' cellspacing='4'\n";
echo "<tr>\n";
//obliczenie wielkosci przycisku
$szerokosc=100/count($przyciski);

foreach ($przyciski as $nazwa=>$url)
{
$this->WyswietlPrzycisk ($szerokosc, $nazwa, $url, !$this->CzyToAktualnyURL
($url));
}
echo "</tr>\n";
echo "</table>\n";
}
public function CzyToAktualnyURL($url)
{
if(strpos($_SERVER['PHP_SELF'], $url)==false)
{
return false;
}
else
{
return true;
}
}
public function WyswietlPrzycisk($szerokosc, $nazwa, $url, $active=true)
{
if($active)
{
echo "<td width='".htmlentities($szerokosc)."%'>
<a href='".htmlentities($url)."' />
<img src='m-logo.gif' alt='".htmlentities($nazwa)."' border='1'>
<a href='".htmlentities($url)."'><span
class='menu'>$nazwa</span></a></td>";
}
else
{
echo "<td width='".htmlentities($szerokosc)."%'>
<img src='boczne-logo.gif'>
<span class='menu'>$nazwa</span></td>";
}
}
?>



1. Nie rozumiem czemu służy to $szerokosc=100/count($przyciski); ?

2a. Dlaczego tutaj jeden wskaźnik this jest zawarty w drugim, jakie to ma znaczenie? $this->WyswietlPrzycisk ($szerokosc, $nazwa, $url, !$this->CzyToAktualnyURL ($url)); ?


2b. Jeszcze nie rozumiem tej funkcji foreach. Tutaj jest zmianna $przyciski zapisana jako zmienna $nazwa i … ? (=>$url) ?

3. Co ten blok kodu tutaj sprawdza if(strpos($_SERVER['PHP_SELF'], $url)==false) ?


Trochę kodu uciąłem, bo się nie mieścił, ale chyba wycięty kod nie ma znaczenia dla pytań.
Foxx
0. Gdybyś użył znaczników php to by się lepiej czytało Twój kod.
1. Ta instrukcja
  1. <?php
  2. $szerokosc=100/count($przyciski);
  3. ?>

przypisuje zmiennej $szerokosc wartosc 100 podzielone przez liczbę elementów w tablicy $przyciski. Korzystaj z manuala jeżeli widzisz funkcję, ktorej nie znasz:
count()" title="Zobacz w manualu PHP" target="_manual.
Widocznie trzeba 100 jednostek rozdzielić porówno między wszystkie przyciski do wyświetlenia.

2a. Ta konstrukcja:
  1. <?php
  2. $this->WyswietlPrzycisk ($szerokosc, $nazwa, $url, !$this->CzyToAktualnyURL ($url));
  3. ?>

To wywołanie metody WyswietlPrzycisk. Przyjmuje ona 4 parametry: szerokość, nazwę, url i ostatni, prawodpodobnie w postaci true/false. I ten ostatni parametr pochodzi stąd, że zwraca go metoda CzyToAktualnyURL, która przyjmuje 1 argument - url (i prawdopodobnie porównuje go z aktualnym i zwraca true lub false).

2b. Jest to trochę bardziej rozbudowana forma instrukcji foreach. Wykonaj sobie taki kod i wyciagnij wnioski:
  1. <?php
  2. $tablica = array('zwierze1' => 'kot', 'zwierze2' => 'pies');
  3. foreach ($tablica as $klucz=>$wartosc)
  4. {
  5.  echo 'jestem kluczem: '.$klucz.' a ja jego wartoscia: '.$wartosc;
  6. }
  7. ?>


3b.
  1. <?php
  2. if(strpos($_SERVER['PHP_SELF'], $url)==false) ?
  3. ?>

Manual: strpos()" title="Zobacz w manualu PHP" target="_manual
Wykonaj u siebie kod
  1. <?php
  2. print_r($_SERVER);
  3. ?>

i zobacz co jest pod kluczem PHP_SELF.
art_php
Ok - dzięki, czytelnie wytłumaczone.
Zajrzę do manuala także.

Dalej studiuje ten kod i mam dwa pytania:

1. Widzę, że w tym bloku "Wyswietl ()",

Kod
public function Wyswietl()
{
    echo "<html>\n<head>\n";
    $this->WyswietlTytul();
    $this->WyswietlSlowaKluczowe();
    $this->WyswietlStyle();
    echo"</head>\n<body>\n";
    $this->WyswietlNaglowek();
    $this->WyswietlMenu($this->przyciski);
    echo $this->zawartosc;
    $this->WyswietlStopke();
    echo "</body>\n</html>\n";
}


nie ma odwołania do wskaźnika $this->CzyToAktualnyURL. Myślałem, że tu wszystko ma być co się pojawi na stronie. Jak dodam ten wskaźnik to nic nie zmienia na stronie, jakby rzeczwyiście w tym miejscu nie był potrzebny, ale dlaczego?

2. Wyrzucam kawałki kodu i patrzę co się stanie, żeby takim sposobem zoabczyć zanczneie poszczególnych funkcji. Wyrzuciłem ten fragment i nie było żandej zmiany na stronie, dlaczego?

Kod
public function __set($nazwa,$wartosc)
{
    $this->$nazwa=$wartosc;
}


3. Po za tym doczytałem się w jednym poście na tym forum, że nie należy mieszać kodu HTML z PHP, tak jak tutaj, ale jeśli buduję się strony (to akurat przykład z książki, więc pewnie dlatego jest to połaczony HTML z PHP, w ramach tutorialu) łącząc te dwa języki to co w tym złego? Jeśli to dluga odpowiedź to chętnie poczytam jak ktoś poda tutaj link do podobnego pytania.
blooregard
Cytat
nie ma odwołania do wskaźnika $this->CzyToAktualnyURL

Widocznie tej funkcji (bo jest to funkcja, a nie, jak to nazwałeś, blok kodu) nie jest potrzebna do działania wartość tej składowej.

Cytat
2. Wyrzucam kawałki kodu i patrzę co się stanie, żeby takim sposobem zoabczyć zanczneie poszczególnych funkcji. Wyrzuciłem ten fragment i nie było żandej zmiany na stronie, dlaczego?

Dlatego, ze instrukcja:
  1. <?php
  2. $this->$nazwa=$wartosc;
  3. ?>

przypisuje zmiennej (a właściwie składowej klasy) o nazwie $nazwa wartość zmiennej $wartosc.
Aby zobaczyć coś na ekranie, musiałbyś dopisać jeszcze linijkę odpowiedzialną za wyświetlenie $this->nazwa na ekranie, co pozostawiam Ci jako ćwiczenie smile.gif

BTW konstrukcja $this->$nazwa=$wartosc; jest błędna ($ przed nazwa)

Cytat
3. Po za tym doczytałem się w jednym poście na tym forum, że nie należy mieszać kodu HTML z PHP, tak jak tutaj, ale jeśli buduję się strony (to akurat przykład z książki, więc pewnie dlatego jest to połaczony HTML z PHP, w ramach tutorialu) łącząc te dwa języki to co w tym złego? Jeśli to dluga odpowiedź to chętnie poczytam jak ktoś poda tutaj link do podobnego pytania.

Generalnie zasada jest taka: odzdzielamy logikę aplikacji od jej warstwy prezentacyjnej (czyli: nie mieszamy kodu odpowiedzialnego za pobieranie/przetwarzanie danych z tym odpowiedzialnym za wyświetlanie rezultatów).
Ale myślę, że na tym etapie Twojej nauki jest jeszcze trochę za wcześnie na takie rzeczy. Zresztą, z czasem sam do tego dojdziesz tak naprawdę, pamiętając tylko o jednej zasadzie: osobno logika - osobno prezentacja.
art_php
Hm, próbowałem wykonać punkt drugi, ale bez skutku, możesz jeszcze raz wytłumaczyć w jakiś sposób ma wpisać "$this->$naz ..." żebym zobaczył coś na ekranie i gdzie ? Bo wpisuję pod funkcją Wyswietl() w innych miejscach kodu, ale chyba nie tędy droga...
blooregard
Cytat
Hm, próbowałem wykonać punkt drugi, ale bez skutku, możesz jeszcze raz wytłumaczyć w jakiś sposób ma wpisać "$this->$naz ..." żebym zobaczył coś na ekranie i gdzie ? Bo wpisuję pod funkcją Wyswietl() w innych miejscach kodu, ale chyba nie tędy droga...


Nie w jaki sposób wpisać, tylko CO wpisać, żeby pokazało Ci wartość zmiennej na ekranie.
Podpowiedź 1: jakiej funkcji używamy, gdy chcemy wyświetlić coś na ekranie?
Podpowiedź 2: dokładnie masz to pokazane w kodzie f-cji Wyswietl()

Małe sprostowanie:
Wcześniej napisałem Ci , że zapis $this->$zmienna jest błędny.
Ale w tym kontekście:
  1. <?php
  2. //operacja klasy Strona
  3. public function __set($nazwa,$wartosc)
  4. {
  5. $this->$nazwa=$wartosc;
  6. }
  7. ?>

jest najzupełniej prawidłowy, Mój błąd wynikający z lenistwa (nie przyjrzałem się dokładnie klasie)
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.