OOP - Object Geörienteerd Programmeren | |
| |
De testcase / vraagstelling | |
|
[ Voor 6% gewijzigd door RedHat op 01-01-2006 12:33 ]
OOP - Object Geörienteerd Programmeren | |
| |
De testcase / vraagstelling | |
|
[ Voor 6% gewijzigd door RedHat op 01-01-2006 12:33 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| <?php var $iets; class input { function input_time() { setlocale(LC_TIME, 'nl_NL'); $iets = strftime ("%A %d %B, %Y"); return $iets; } function printIT () { print $this->input_time(); } } ?> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| <?php class input { function input_time() { setlocale(LC_TIME, 'nl_NL'); $iets = strftime ("%A %d %B, %Y"); return $iets; } function printIT () { print $this->input_time(); } } ?> |
[ Voor 10% gewijzigd door RedHat op 01-01-2006 12:42 ]
Dit is toch niet logisch? De variabele $iets valt namelijk buiten de scope van de functie. Dus als je 'm daar voordefineert, dan heb je niets aan binnen de functie (daar bestaat 'ie nl. niet).RedHat schreef op zondag 01 januari 2006 @ 12:42:
Toevoeging op:
Binnen een class var's definieëren waarom???
Twéé voorbeelden, wat allebij werkt, waarom vars voordefiniëren?
Met voorgedefïeneerde strings/vars
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php var $iets; class input { function input_time() { setlocale(LC_TIME, 'nl_NL'); $iets = strftime ("%A %d %B, %Y"); return $iets; } function printIT () { print $this->input_time(); } } ?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| <?php class input { function input_time() { var $iets; setlocale(LC_TIME, 'nl_NL'); $iets = strftime ("%A %d %B, %Y"); return $iets; } function printIT () { print $this->input_time(); } } ?> |
[ Voor 7% gewijzigd door Skaah op 01-01-2006 13:16 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| <?php class input { var $iets; function input_time() { setlocale(LC_TIME, 'nl_NL'); $iets = strftime ("%A %d %B, %Y"); return $iets; } function printIT () { print $this->input_time(); } } ?> |
En waarom nietRedHat over MVC:
Dit is in mijn ogen niet zo zeer geschikt voor dit systeem, google levert een hoop hits op.
cBaseObject (Handige functie lib) cDal cBaseController cBaseModel, maakte gebruik van cDAL cBaseUser cBaseCache cBaseView cBaseRequestHandler (Loodste alles op basis van defaults en config langs C, M en V) cBaseParser (Gaf basis parser functies) cBaseTemplateParser (Templates gebaseerd op .tpl bestanden met inline html) cBaseDomParser (je kon in de classes mbv cBaseDomObject en aanverwanten een DOM-tree opbouwen, waarna deze automagisch tot pagina geparsed werd) cBaseXmlParser (templates gebaseerd op een .xml (config) file)
[ Voor 71% gewijzigd door JHS op 01-01-2006 14:05 ]
1
2
3
4
5
| class v3system (main class, bevat alle settings, alle andere classes worden op deze ge-extend) -> class mysql (database class) -> class userdata (sessie class, handelt alle userdata af, dus logins, permissions etc) -> class errorhandler (spreekt voor zich...) -> class smarty (Smarty template systeem) |
[ Voor 16% gewijzigd door MueR op 01-01-2006 16:47 ]
Anyone who gets in between me and my morning coffee should be insecure.
Dit klopt ook niet. Nu heb je een eigenschap van het object gedefineerd; die je nergens gebruikt. (je hebt $this->iets gemaakt met waarde NULL). Als je persé wilt defineren, is het voorbeeld dat ik gaf (dus met de declaratie in de functie) het enige goede.RedHat schreef op zondag 01 januari 2006 @ 13:27:
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php class input { var $iets; function input_time() { setlocale(LC_TIME, 'nl_NL'); $iets = strftime ("%A %d %B, %Y"); return $iets; } function printIT () { print $this->input_time(); } } ?>
dit bedoelde ik.
Maar graag ook reacties op topicstartveel moeite voor gedaan
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| <?php class input { var $iets; function input_time() { setlocale(LC_TIME, 'nl_NL'); $this->iets = strftime ("%A %d %B, %Y"); } function printIT () { $this->input_time(); echo $this->iets; } } ?> |
[ Voor 60% gewijzigd door Peter op 01-01-2006 14:05 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| <?php class input { var $iets; function input_time() { setlocale(LC_TIME, 'nl_NL'); $this->iets = strftime ("%A %d %B, %Y"); } function printIT () { echo $this->iets; } } ?> |
[ Voor 24% gewijzigd door RedHat op 01-01-2006 14:15 ]
Anoniem: 42791
Ik ben nog een beetje OO maagd, maar ik heb zelf vaak de neiging om uhm wat eens ergens 'noun identification' genoemd werd te doen, ofwel 'identificatie van zelfstandige naamwoorden'. In het geval van jouw CMSje zou je dus een User, Page en UploadFile klasse of iets dergelijks krijgen. Ik kan niet heel goed uitleggen waarom ik het zo zou doen. Ik heb het idee dat het ook als de applicatie mocht groeien overzichtelijker en logischer blijft. Overigens zou ik data access code (Mysql queries dus) wel in een aparte klasse stoppen. Ik heb dat in het systeem dat ik nu bouw als volgt gedaan.RedHat schreef op zondag 01 januari 2006 @ 13:27:
Maar graag ook reacties op topicstartveel moeite voor gedaan
[ Voor 10% gewijzigd door Anoniem: 42791 op 01-01-2006 14:29 ]
Ik zou zeggen, maak het iets uitgebreider, laat eens zien wat een class + functies erin voor functionaliteit en maak er een mooi textje bij wat OOP voor jouw betekend en hoe je het volgens jouw geïmplenteerd heb. Als je tijd hebt.JHS schreef op zondag 01 januari 2006 @ 14:19:
Redhat: Reageer ik, op verzoek, op je topicstart, negeer je me vervolgens![]()
.
[ Voor 22% gewijzigd door RedHat op 01-01-2006 14:35 ]
[ Voor 75% gewijzigd door alienfruit op 01-01-2006 15:12 ]
Als je input_time niet aanroept, heeft $iets nog altijd een NULL waarde.RedHat schreef op zondag 01 januari 2006 @ 14:13:
als je $this->iets echo't dan is $this->input_time() ook niet meer nodig dunkt me
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?php class input { var $iets; function input_time() { setlocale(LC_TIME, 'nl_NL'); $this->iets = strftime ("%A %d %B, %Y"); } function printIT () { echo $this->iets; } } ?>
zou dan ook moeten volstaan?
Anoniem: 84120
Je kan ook beide combineren: Classes voor basisdingen (Bijvoorbeeld Databasetoegang, uitvoer via template, invoer (beveiligd). En dan deze classes gebruiken in de overige classes. Daarmee bespaar je dus alle 'zelfde' code >> en daar is OO ook voor dacht ik zo.Nu komt de 1e vraag al, hoe ga je je classes indelen.
• 1 Class voor alle acties (Mysql query's e.d.?)
• 1 Class voor al het template meuk? (Dus de templates daadwerkelijk opvragen)
Of ga je classes maken voor elke sectie? (dus PerSection)?
• 1 Class voor Paginabeheer
• 1 Class voor Userbeheer
• 1 Class voor Bestandsbeheer
Echt heel duidelijk is dat niet, want elke class krijgt dezelfde functies bijna, die dan 'net' iets anders uitvoeren, dubbel werk lijkt het dan wel. Of je nu een pagina of een gebruiker toevoegt, zo héél veel verschil zit daar niet in, het word allemaal in MySQL weggeschreven.
Ik vroeg ook vooral om een reactie op het feit dat ik me afvroeg wat je tegen MVC hebtRedHat schreef op zondag 01 januari 2006 @ 14:33:
[...] Ik zou zeggen, maak het iets uitgebreider, laat eens zien wat een class + functies erin voor functionaliteit en maak er een mooi textje bij wat OOP voor jouw betekend en hoe je het volgens jouw geïmplenteerd heb. Als je tijd hebt.
Mijn controller haalt data uit de Models en zet deze om in voor de View beschikbare en bruikbare data / variabelenWat doet je controller bijvoorbeeld?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| class CMS_BASE function checkVar(); // checks var (options: email, name, is_numeric, automatically check for magic quotes) function connectDB(); // makes an connection to a mysql database function placeEnters(); // nl2br a specified string and returns the nl2bréd string function createTimeStamp(); // makes a nice timestamp (Options NOW(), and specified date) function SetPageTitle(); // Zorgt voor een gekozen titel class Templateparser Functions for template parsing class thisUser function isLoggedIn(); // checks for logged in, if not, then show login function showLogin(); // shows the login form to login function loginUser(); // This is for actually log in the user function logoutUser(); // This is for logging out the user function checkRights(); // Check rights for section (e.g. checkRights("can_modify_userinfo") function makeSession(); // make a sessionhash for cookie function getUserData(); // This is for getting userdata from mysql (like firstname) function checkActive(); // Is this user active? Or set to non_active? |
[ Voor 20% gewijzigd door aex351 op 02-01-2006 20:21 ]
< dit stukje webruimte is te huur >
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
| <?php mysql_connect(); // notshowing :) mysql_select_db(); // not showing :) class thisUser { var $thisUser; var $userSpec; /* == (is_logged) Checks if user is logged in == */ function isLogged () { if (isset($_COOKIE['session'])) { $this->isLogged = TRUE; } else { $this->isLogged = FALSE; } } /* == (valid_user) Checks if user is valid logged in == */ function validUser () { $thisUser = mysql_query("SELECT * FROM Users WHERE userID = ' " . $_COOKIE['userid'] . " ' AND userSession = ' " . $_COOKIE['session']) or die (mysql_error()); if (mysql_num_rows($thisUser) == 0) { return TRUE; } else { return FALSE; } } /* == (get_user) Get userinfo == */ function getUser ($userSpec) { $thisUser = mysql_fetch_assoc($thisUser); $getUserInfo = array ( 'userID' => $thisUser['userID'], 'userName' => $thisUser['userName'] ); return $getUserInfo[$userSpec]; } } $newUser = new thisUser; if (!$newUser->isLogged) die ("Not logged in mate"); if (!$newUser->validUser) die ("No valid login"); echo $newUser->getUser("userName"); ?> |
Wat 'pakt hij niet'? Maarum, als er geen matchende users gevonden zijn returned 'ie true? -> No valid login? Of zit ik te slapen?RedHat schreef op maandag 02 januari 2006 @ 21:23:
Ik ga even een voorbeeldje geven van een userclass....
Het werkt allen nog niet (onderaan de file, hij pakt hem niet, $_COOKIE['session'] = wel aanwezig)
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?php /* == (valid_user) Checks if user is valid logged in == */ function validUser () { $thisUser = mysql_query("SELECT * FROM Users WHERE userID = ' " . $_COOKIE['userid'] . " ' AND userSession = ' " . $_COOKIE['session']) or die (mysql_error()); if (mysql_num_rows($thisUser) == 0) { return TRUE; } else { return FALSE; } } } $newUser = new thisUser; if (!$newUser->isLogged) die ("Not logged in mate"); if (!$newUser->validUser) die ("No valid login"); echo $newUser->getUser("userName"); ?>
[ Voor 20% gewijzigd door aex351 op 02-01-2006 21:48 ]
< dit stukje webruimte is te huur >
Regeren is vooruitschuiven
Functioneel programmeren is niet wat jij denktT-MOB schreef op dinsdag 03 januari 2006 @ 03:16:
In wezen dus gestuctureerd functioneel programmeren.
De levensduur van een request lijkt me nou niet direct een argument voor het een of ander.Het voordeel dat je de status van een object kunt uitlezen verdwijnt toch binnen de halve microseconde die je request duurt.
Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.
1
| function loadDataOfThisUserForGetUserMethodToUseAndReturnIfThisUserIsValid() /*...*/ |
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
61
62
63
64
65
66
| <?php class User { var $userID; var $username; var $session; function User($userID = null, $username = null, $session = null) { $this->userID = $userID; $this->username = $username; $this->session = $session; } function getUserID() { return $this->userID; } function getUsername() { return $this->username; } function getSession() { return $this->session; } function isLoggedIn() { return isset($_COOKIE['session']) && $this->session == $_COOKIE['session']; } function isValid() { return !is_null($this->userID); } } class UserManager { function getCurrentUser() { $user = UserRepository::getByUserIDAndSession($_COOKIE['userid'], $_COOKIE['session']); return is_null($user) ? new User() : $user; } } class UserRepository { function getByUserIDAndSession($userID, $session) { $query = "SELECT * FROM Users WHERE userID = '" . $userID . "' AND userSession = '" . $session . "'"; // fout -> return $this->createUserFromQuery($query); return self::createUserFromQuery($query); } function createUserFromQuery($query) { $result = mysql_query($query) or die(mysql_error()); if ( !( $record = mysql_fetch_assoc($result) ) ) return null; return new User( $record['userID'], $record['userName'], $record['userSession'] ); } } $currentUser = UserManager::getCurrentUser(); if (!$currentUser->isLoggedIn()) die ("Not logged in mate"); if (!$currentUser->isValid()) die ("No valid login"); echo $currentUser->getUsername(); ?> |
[ Voor 14% gewijzigd door Michali op 03-01-2006 20:17 . Reden: Klein stukje code gewijzigd ]
Die gedachte had ik ook ooit mbt. ASP.NET. Want je objecten 'leven' toch nooit langer dan 1 request dus zul je iedere keer opnieuw die dingen moeten aanmaken. Maar als je eemaal ermee aan de slag gaat, dan kom je erachter dat het een heel mooi systeem is om abstractie te creeeren tussen al je lagen. Je kunt een object heel makkelijk doorsturen van je datalaag naar je businesslaag naar je pagina's.T-MOB schreef op dinsdag 03 januari 2006 @ 03:16:
Waar ik altijd tegenaanloop is dat het door de statelessness van het HTTP protocol vaak onzin is om classes te maken die zinnig zijn in een applicatie. Een uitgekristalliseerd user-object is in negen van de 10 gevallen onzin omdat je helemaal niet hoeft te weten dat Jantje username "ploert" heeft en in Den Helder woont.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| class PageInfo ------------------- Id Title Owner --UserId --UserName UserAccess[] --UserId --CanEdit --CanView --CanDelete Template --Title --FilePath --Panel[] ----PanelName PageItem[] --PanelName --Content |
[ Voor 13% gewijzigd door Not Pingu op 03-01-2006 13:07 ]
Certified smart block developer op de agile darkchain stack. PM voor info.
1
| Fatal error: Call to a member function on a non-object in /index.php on line 48 |
1
2
3
4
| function getCurrentUser() { $user = UserRepository::getByUserIDAndSession($_COOKIE['userid'], $_COOKIE['session']); return is_null($user) ? new User() : $user; } |
1
| return $this->createUserFromQuery($query); |
1
| return self::createUserFromQuery($query); |
[ Voor 17% gewijzigd door Michali op 03-01-2006 20:20 ]
1
| UserManager::getCurrentUser() |
Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.
De fout zat dus niet in het stukje code dat je gaf. Ik mijn code heb ik het ook gewijzigd. Het was regel 46, dat is nu een comment, regel 47 is nu de juiste. En omdat zowel de call als de functie definitie binnen de class UserRepository zitten kun je wel self:: gebruiken. De fout zit dus niet in getCurrentUser, die functie zit wel buiten de scope van UserRepository en dat moet wel gewoon UserRepository:: zijn.RedHat schreef op woensdag 04 januari 2006 @ 06:44:
self is niet gedefinieerd in php4 iig.
Dus dat word updaten naar php5
1
2
3
| function isLoggedIn() { return isset($_COOKIE['session']) && $this->session == $_COOKIE['session']; } |
1
2
3
4
| function isLoggedIn() { $this->session == $_COOKIE['session']; return isset($_COOKIE['session']); } |
[ Voor 35% gewijzigd door RedHat op 04-01-2006 20:00 ]
[ Voor 10% gewijzigd door Michali op 04-01-2006 22:33 ]
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
61
62
63
64
65
66
67
68
| <?php class User { var $userID; var $username; var $session; function User($userID = null, $username = null, $session = null) { $this->userID = $userID; $this->username = $username; $this->session = $session; } function getUserID() { return $this->userID; } function getUsername() { return $this->username; } function getSession() { return $this->session; } function isLoggedIn() { $this->session = $_COOKIE['session']; return isset($_COOKIE['session']); } function isValid() { return !is_null($this->userID); } } class UserManager { function getCurrentUser() { $user = UserRepository::getByUserIDAndSession($_COOKIE['username'], $_COOKIE['session']); return is_null($user) ? new User() : $user; } } class UserRepository { function getByUserIDAndSession($username, $session) { $query = "SELECT * FROM Users WHERE userName = '" . $username . "' AND userSession = '" . $session . "'"; return UserRepository::createUserFromQuery($query); } function createUserFromQuery($query) { $result = mysql_query($query) or die(mysql_error()); if (!( $record = mysql_fetch_assoc($result))) echo"whacked"; return new User( $record['userID'], $record['userName'], $record['userSession'] ); } } $currentUser = UserManager::getCurrentUser(); if (!$currentUser->isLoggedIn()) die ("not logged in"); if (!$currentUser->isValid()) die ("n0t Val1d" . $currentUser->getUsername()); echo $currentUser->getUserName(); ?> |
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
| $cLoginQ = "SELECT Users.userName, Users.userSession, Users.userIsActive, DATE_FORMAT(Users.userLastLogin, '%d-%m-%Y %H:%i:%s') as userLastLog, Rights.rightUserID, Rights.rightPageAccess, Rights.rightPageCreate, Rights.rightPageEdit, Rights.rightPageRemove, Rights.rightPageVisible, Rights.rightUserAccess, Rights.rightUserCreate, Rights.rightUserEdit, Rights.rightUserRemove, Rights.rightEditAccess, Rights.rightEditRights, Rights.rightMailView, Rights.rightMailRemove, Rights.rightMailProcessed, Rights.rightMailCreateNote, Rights.rightMailRemoveNote, Rights.rightMailEditNote, Rights.rightUploadAccess, Rights.rightUploadFile, Rights.rightUploadDelFile, Rights.rightStatView, Rights.rightStatSwap FROM Users INNER JOIN Rights ON Rights.rightUserID = Users.userID WHERE userSession = '$_COOKIE[session]' AND userName = '$_COOKIE[username]'"; |
[ Voor 12% gewijzigd door RedHat op 05-01-2006 08:12 ]
Dit kan best met objecten. Zie ook mijn post hierboven. Ik weet niet precies in hoeverre OO in PHP is geimplementeerd, maar de rechten van een user zijn natuurlijk direct gerelateerd aan die user. Dus als je een User class hebt dan zou je rechtencollectie een property van die User class zijn.RedHat schreef op donderdag 05 januari 2006 @ 08:10:
Dit kan niet meer met OOP, want dan gaat een functie twéé dingen doen, en usergegevens ophalen en rechtengegevens ophalen.
Hoe kan ik dit het beste aanpakken (puur educatief dus, ik ga bovenstaande code uitbreiden zodat ik er verders nog wat van kan leren).
Certified smart block developer op de agile darkchain stack. PM voor info.
Anoniem: 3431
[ Voor 30% gewijzigd door Anoniem: 3431 op 05-01-2006 10:04 ]
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
| <?php // Domein class User { private $rights; public function __construct(IUserRights $rights) { $this->rights = $rights; } public function hasRightTo($action) { return $this->rights->hasRightTo($this, $action); } } interface IUserRights { public function userHasRightTo(User $user, $action); } interface IUserRepository { public function getByID($userID); } class Registry { private static $userRepository; public static function setUserRepository(IUserRepository $userRepository) { self::$userRepository = $userRepository; } public static function getUserRepository() { return self::$userRepository; } } // Implementatie class DBUserRights implements IUserRights { public function hasRightTo(User $user, $action) { $query = " SELECT r.`" . $action . "` FROM Rights r, User u WHERE r.rightUserID = u.userID AND u.userID = '" . mysql_real_escape_string($user->getUserID()) . "' "; $result = mysql_query($query); return 1 == (int)mysql_result($result, 0); } } class DBUserRepository implements IUserRepository { public function getByID($userID) { // select data met sql query op basis van $userID $user = new User(new DBUserRights()); // user vullen met andere data return $user; } } // index.php (of waar je ook begint) Registry::setUserRepository(new DBUserRepository()); // client code $user = Registry::getUserRepository()->getByID(123); if ( !$user->hasRightTo('editPages') ) die("Insufficient rights!"); ?> |
[ Voor 51% gewijzigd door Michali op 05-01-2006 13:49 ]
https://fgheysels.github.io/
Anoniem: 99283
Waarschijnlijk is de authorisatie een verantwoordelijkheid gemaakt van de User class, omdat dat de "information expert" is hier; een hoop informatie die benodigd is voor het authorisatie-proces is opgeslagen in de User class zelf.PrisonerOfPain schreef op zaterdag 25 februari 2006 @ 15:25:
Waarom zorgt de User class zelf voor de authorisatie? Lijkt mij nou niet bepaald de taak van een User zelf zou ik dat in een Authorization class gezet hebben en de User in principe niet veel meer als een Value Object laten zijn (danwel iets in die trant).
Apple iPhone 16e LG OLED evo G5 Google Pixel 10 Samsung Galaxy S25 Star Wars: Outlaws Nintendo Switch 2 Apple AirPods Pro (2e generatie) Sony PlayStation 5 Pro
Tweakers is onderdeel van
DPG Media B.V.
Alle rechten voorbehouden - Auteursrecht © 1998 - 2025
•
Hosting door TrueFullstaq