Strona 1 z 4
Programowanie obiektowe
Napisane: poniedziałek, 26 listopada 2012, 00:26
przez tajger
Zakładam temat, w kórym na pewno pojawi się trochę pytań dotyczących programowania obiektowego. Żal mi przyznać, że szkoda jest mi przechodzić ze strukturalnego na obiektówkę, ale jak to mówią nie wolno stać w miejscu a trza się rozwijać. Jak na razie to w materiałach stanąłem na obiektówce w PHP, kupiłem potem MySQL, ponieważ był bardzo mi potrzebny na tamten czas. Czas pójść do przodu i zrozumieć 'to coś', bo kompletnemu laikowi jest zawsze najtrudniej.
Przechodząc na obiektówkę każdą zmienną którą będę chciał zadeklarować, będę musiał to robić w formie obiektowej (chodzi mi też o wszystko co się dzieje na zmiennych, operacje itd.)? Od razu podkreślam, że oglądnąłem twój videokurs w PHP z czasem i klasami, ten pierwszy wstęp do programowania obiektowego i są problemy nie mogę tego pojąć, dlatego zaczynam od takiego pytania.
Przykładowo tworzę sobie 3 zmienne w pliku matematyka.php:
$a=5;
$b=7;
$c=$a+$b
echo "Hej! Twój wynik to: ".$c;
EDIT1
Postanowiłem zrobić coś takiego i nie przechodzi już na samym starcie w public $c:
class Math {
public $a = 5;
public $b = 7;
public $c = $a + $b;
}
EDIT2
Po kilku minutach zrobiłem coś takiego:
class Math {
public $a = 5;
public $b = 7;
public $c;
}
$zmienna = new Math;
$zmienna->c=$zmienna->a+$zmienna->b;
echo $zmienna->c;
Jest to poprawnie napisane?
Re: Programowanie obiektowe
Napisane: poniedziałek, 26 listopada 2012, 11:35
przez Morfidon
To, że działa nie znaczy, że ma sens.
Klasa to forma do tworzenia obiektów i operacje na tym co znajduje się wewnątrz obiektu powinieneś wykonywać wewnątrz klasy przy pomocy funkcji / konstruktorów.
Re: Programowanie obiektowe
Napisane: poniedziałek, 26 listopada 2012, 14:20
przez tajger
Czyli generalnie chodzi ci o to, żeby wszystkie operacje, metody zawierać w klasie, a wypisywanie danych z klasy zawrzeć poza jej klamrami:
class Math {
public $a = 5;
public $b = 7;
public $c;
metody do wykonania operacji c=a+b
}
echo $zmienna->c;
Re: Programowanie obiektowe
Napisane: poniedziałek, 26 listopada 2012, 15:44
przez Morfidon
Nie, pobieranie elementów robisz przy pomocy getterów, o których mówię w lekcji 27. Nie powinieneś robić nic ze zmiennymi z zewnątrz jeśli nie jest to za pomocą metody.
Re: Programowanie obiektowe
Napisane: poniedziałek, 26 listopada 2012, 18:40
przez tajger
Widzę, że muszę to na spokojnie ogarnąć i jeszcze raz przejrzeć twoją pierwszą lekcję.
Re: Programowanie obiektowe
Napisane: wtorek, 27 listopada 2012, 00:43
przez Morfidon
Nie tylko pierwszą na początku pokazuje możliwości, później pokazuje jak się pisze.
Re: Programowanie obiektowe
Napisane: wtorek, 27 listopada 2012, 19:00
przez tajger
Ty robisz obiekty nie w pliku z daną klasą pod klasą tylko po prostu już na stronie i tylko require dorzucasz wyżej. Czyli robimy jedną klasę na 1 program zawsze, żeby było prościej i czytelniej?
Re: Programowanie obiektowe
Napisane: wtorek, 27 listopada 2012, 21:20
przez Morfidon
Tak, najczęściej tak się robi. Jeden plik jedna klasa.
Re: Programowanie obiektowe
Napisane: piątek, 30 listopada 2012, 21:36
przez tajger
W NetBeansie nie działa w taki sposób opisywanie zmiennych jak podałeś, np:
/**
* @var $futureTime - Tekst
*/
public $timeZone;
public $currentTime;
public $futureTime;
const DEFAULT_TIME_ZONE = "Europe/Warsaw";
@var $futureTime - to działa, ale tekst dalej już nie będzie widoczny, a poza tym każdy taki komentarz to tylko 1 definicja zmiennej chyba, wiec trzeba spamowac, a myślałem, że po ENTERku można dodawać kolejną definicje zmiennej itd. Najlepiej nic nie pisac tylko sam tekst w tym komentarzu to pod $timeZone bedzie opisany, i następnie trzeba byłoby pod następnymi zmiennym tak zrobić. Albo może robię coś źle ?
Re: Programowanie obiektowe
Napisane: sobota, 1 grudnia 2012, 17:48
przez tajger
W rozdziale w kalsach abstrakcyjnych zrobiłeś funkcję w klasie dog, która korzystała z klasy AnimalAbstract. Potem wrzuciłeś ją do AnimalAbstract i potworzyłeś zmienne protected dla food. Klasy, które dziedziczą po klasie wyżej mogą używać ich cech itd. sama nazwa wskazuje. Jak to jest możliwe, że $this->eatableFood, który jest w tej klasie i nie jest zadeklarowany, a jest zadeklarowany w niższej od siebie klasie np. Dog czy Cat. To tak jakby dziedziczenie w drugą stronę albo w dwie strony. Skąd główna klasa wie, że ta zmienna będzie brana z niższych? Może tak wolno robić? To jest dla mnie lekko niezrozumiałe.
Ja zrobiłem eating zamiast eatable.
require_once 'class.AnimalAbstract';
require_once 'class.Dog';
require_once 'class.Cat';
$a = new Dog;
$b = new Cat;
$a->eat("chicken");
$a->eat("meat");
$b->eat("groch");
$b->eat("bird");
abstract class AnimalAbstract
{
protected $isHungry;
function __construct($isHungry=true)
{
$this->isHungry = $isHungry;
}
function eat($food)
{
$isEating = false;
foreach($this->eatingFood as $value)
{
if($value==$food)
{
$isEating = true;
break;
}
}
if($isEating)
{
if($this->isHungry)
{
echo $this->animal."Jem $food <br />";
$this->isHungry = false;
}
else
{
echo $this->animal."Nie jestem glodny<br />";
}
}
else
{
echo $this->animal."Ja nie jem $food<br />";
}
}
}
class Dog extends AnimalAbstract
{
protected $animal = "[PIES] ";
protected $eatingFood = array("meat", "chicken");
}
class Cat extends AnimalAbstract
{
protected $animal = "[KOT] ";
protected $eatingFood = array("fish", "bird");
}