Wat is er anders aan MVC in Java dan in PHP?quote:Op zaterdag 26 mei 2012 11:09 schreef cablegunmaster het volgende:
[..]
Ik snap OO programeren In Java beter dan in Phpdaar heb ik al een MVC model gebouwd. Hierbij zit ik nog te kijken of ik in Phpstorm* een eigen MVC kan opzetten. Zit niet zo denigrerend te doen
![]()
![]()
Het heeft als nadeel dat iedere method waar je "global $db;" gebruikt, potentieel je database instance kan veranderen door iets anders. Dan krijg je fouten die heel lastig te vinden zijn. Als je in je model een setter hebt voor de database, kun je daar valideren dat je echt een database object krijgt. En daarna heb je een reference naar het object, daar kan de rest van de wereld niet bij.quote:Vragen die ik had waren:
1. Ik heb een DB klasse moet ik daarvoor bij elke classe , functie perse Global $db neerzetten? of is GLOBALS['db'] Daarvoor een betere oplossing? (Ik lees overal dat Globals "onveilig" of onhandig waren) Vanuit de gebruikers opinie. Weet nu niet of hier een waarheid in zit?
Smarty (of een ander templating systeem) hoort in de view.quote:2. Als ik eenmaal bezig ben zat ik mijn structuur uit te denken, om een goede basis te creëren. met $_POST en afhandeling van $_GET. (filestructuur).
3. Hoe verwerk ik Smarty. (vermoedelijk met behulp van de View)
1. geen idee , gewoon nog niet mee gewerkt.quote:Op zaterdag 26 mei 2012 11:55 schreef Light het volgende:
Wat is er anders aan MVC in Java dan in PHP?
[..]
Het heeft als nadeel dat iedere method waar je "global $db;" gebruikt, potentieel je database instance kan veranderen door iets anders. Dan krijg je fouten die heel lastig te vinden zijn. Als je in je model een setter hebt voor de database, kun je daar valideren dat je echt een database object krijgt. En daarna heb je een reference naar het object, daar kan de rest van de wereld niet bij.
[..]
Smarty (of een ander templating systeem) hoort in de view.
Ik heb mezelf schromelijk overschat.quote:Op zaterdag 26 mei 2012 10:56 schreef boem-dikkie het volgende:
Ben je al zo ver dat je MVC begrijpt?
De structuren zijn gewoon hetzelfdequote:Op zaterdag 26 mei 2012 12:08 schreef cablegunmaster het volgende:
[..]
1. geen idee , gewoon nog niet mee gewerkt.
quote:2. Dus eigenlijk in de controller Pseudo: Setdb($db) functie. if(get_class($db) == "db"); true false.
en dan het toepassen. met Getdb(); in elke klasse?
| 1 2 3 4 5 6 7 8 9 | <?php private $db; public function setDb(MyDatabaseClass $db) { $this->db = $db; } public function getDb() { return $this->db; } ?> |
Dat vind ik dus het grote nadeel van PHP, loose typing.quote:Op zaterdag 26 mei 2012 11:55 schreef Light het volgende:
[..]
Het heeft als nadeel dat iedere method waar je "global $db;" gebruikt, potentieel je database instance kan veranderen door iets anders.
Da's een nadeel, ben ik met je eens. Maar 't is een eigenschap van de taal waar je dus gewoon mee moet werken (of je zoekt een andere taal op om mee te werken).quote:Op zaterdag 26 mei 2012 12:20 schreef Devv het volgende:
[..]
Dat vind ik dus het grote nadeel van PHP, loose typing.
Java is daar weer makkelijker in , php is daar loosse in.quote:Op zaterdag 26 mei 2012 12:24 schreef Light het volgende:
[..]
Da's een nadeel, ben ik met je eens. Maar 't is een eigenschap van de taal waar je dus gewoon mee moet werken (of je zoekt een andere taal op om mee te werken).
| 1 2 3 4 5 | <?php $array = Array(); $string = (string) $waarde; $integer = (int) $integer; ?> |
Leg eens uit wat was je idee?quote:Op zaterdag 26 mei 2012 14:11 schreef Quir het volgende:
Iemand eerder meegemaakt dat fopen aangeroepen in een class destructor vervelend doet?
Ik vroeg het inderdaad zonder toelichting omdat ik dacht dat het een bug zou zijn. Had die pagina ook al gevonden, maar die is uit 2004/2007, dus ik hoopte dat het inmiddels wel gefixt zou zijn. Nog steeds gissen of dat de dwarsligger is of niet.quote:Op zaterdag 26 mei 2012 14:47 schreef Devv het volgende:
Misschien heb je hier iets aan: Bug #29167 fopen works differently in a constructor vs. a destructor.
Ik heb een cache functie die een kopie uit de cache doorsluist wanneer er een (niet-verlopen) beschikbaar is, zoniet, roept-ie ob_start() aan en set hij een variabele op True.quote:
| 1 2 3 4 5 6 | <?php if ($this->cacheUsage) { $this->writeToFile($this->cachePath . $this->cacheName . '.html', 'w', ob_get_contents()); ob_end_flush(); } ?> |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php public function writeToFile($path, $mode, $data) { $success = 'Error'; if ($file = fopen($path, $mode)) { if (fwrite($file, $data)) { fclose($file); $success = 'Success!'; goto End; } fclose($file); $success = 'Failed to write'; goto End; } $success = 'Failed to open file'; End: return $success; } ?> |
| 1 | Warning: fopen(Cache/pagina.html) [function.fopen]: failed to open stream: No such file or directory |
Waarom zou je dit willen? Had even wat posts doorgelezen, maar snap niet je opzet.quote:Op zaterdag 26 mei 2012 15:11 schreef cablegunmaster het volgende:
Ik lees als je unset($Object); gebruikt de destructor wordt aangeroepen.
andere optie: register_shutdown_function("Object");
Nog een idee fopen in de constructor aanroepen en vervolgens fclose(); gebruiken in de destructor.
of werkt fwrite niet in de destructor?
Bron:
http://stackoverflow.com/(...)er-shutdown-function
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | <?php class Game { // Holds player name public $players = array(); // Game id database public $game_id; // Minimum start bid public $minimum_bid = 3; private $pdo; private $rules; // Holds turns public $turns = array(); public $bids = array(); // Sets game Id public function __construct(Array $players, Rules $rules) { $this->players = $players; $this->pdo = new Database(); $this->rules = $rules; } // Removes a player when he loses connection or leaves the game public function removePlayer($player = array()) { if(array_key_exists($player['name'], $this->players)) { unset($this->players[$player['name']]); } } public function nextTurn() { $stop = false; foreach($this->players as $player) { if($player == $this->player_turn) $stop = true; if($stop) { $this->playerTurn = $player; break; } } } public function setBid($name, $bid) { $this->bids[$name] = $bid; } public function __sleep() { $this->pdo = null; return array('players','game_id', 'bids', 'minimum_bid', 'turns', 'rules'); } } ?> |
Ik ben bezig met een uitgebreide site om te bouwen daarom mijn terughoudenheid om alles goed te makenquote:
unset() zorgt er niet direct voor dat de destructor wordt aangeroepen. Dat gebeurt alleen als de garbage collector het object opruimt. En dat gebeurt alleen als geen referenties meer zijn naar het object, maar dan hoeft het nog niet meteen te gebeuren.quote:Op zaterdag 26 mei 2012 15:11 schreef cablegunmaster het volgende:
Ik lees als je unset($Object); gebruikt de destructor wordt aangeroepen.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?php class Cache { public $cacheUsage; function __construct() { $this->cacheUsage = False; } public function callCache($expiration) { if (file_exists('Page.html') && (time()-filemtime('Page.html')) < $expiration) { include 'Page.html'; $this->cacheUsage = False; exit(); } else { ob_start(); $this->cacheUsage = True; } } protected function writeToFile($path, $mode, $data) { $file = fopen($path, $mode); fwrite($file, $data); fclose($file); } function __destruct() { if ($this->cacheUsage) { $this->writeToFile('Page.html', 'w', ob_get_contents()); ob_end_flush(); } } } $CacheClass = new Cache(); $CacheClass->CallCache(30); echo 'Hallo!'; ?> |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php class websiteController { private $model; private $view; public function __construct($model,$view) { $this->model = $model; $this->view = $view; } public function listenerA($test){ $this->model->doeIets($test); } } ?> |
| 1 2 3 4 | <?php //bevat $controller = websitecontroller object $controller->listenerA($_GET['test']); ?> |
Ik zit nu na te denken hoe ik de $_POST , $_GET afhandeling moet uitvoeren.quote:
Ik krijg nu heel veel ingewikkelde code in google als ik dit zoek.quote:Op dinsdag 29 mei 2012 14:48 schreef Scorpie het volgende:
Je wil dus $_GET en $_POST acties koppelen aan je controller? Kijk eens naar een RequestDispatcher routine.
het hoeft niet naar een andere pagina toe.quote:Request Dispatcher is used to forward a request to another page.
bron: http://www.hscripts.com/tutorials/jsp/examples/example2.php
Dit vind ik als ik op de request dispatcher zoek, beetje ingewikkeld.quote:
| 1 2 3 4 5 6 7 8 | <?php //kort zonder sanitize, voorbeeld. x20 if(isset($_POST['waarde'])) { $waarde = $_POST['waarde']; $controller->listenA($waarde); } ?> |
Ik ga dit eens proberen uit te vogelenquote:
Globals en singelton heb ik altijd al erg onelegant gevonden.quote:
Zelf iets te makenquote:Op dinsdag 29 mei 2012 22:10 schreef Schepseltje het volgende:
Waarom een controller class schrijven als er zoveel frameworks zijn die al een werkende, elegante en geteste implementatie hebben?
| Forum Opties | |
|---|---|
| Forumhop: | |
| Hop naar: | |