Getters & Setters en variabellen in (Codeigniter) MVC
Maar ik vraag me steeds iets af maar kan hier niet echt het antwoord op vinden of wat nou de juiste werkwijze is.
Maak op dit moment om het te leren gebruik van code igniter.
Heb een kleine applicatie geschreven om de google resultaten te scrapen.
Uit de html code haal ik dan de meta title en de meta description.
Hierna maak ik een array met alle woorden die voorkomen en hoevaak ze er in voor komen.
Aan de hand van deze array probeer ik adhv keywords in mijn database te achterhalen om welke niche het gaat.
Hier een stukje van mijn controller :
Code (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
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
## set keyword for scrape google search model
$this->scrapegooglesearch_model->setKeyword($row->keyword);
## load google search content in
$this->scrapegooglesearch_model->loadHtmlContent();
## make words from sentences
$meta_titles_words_array = $this->texttools_model->sentences2words($this->scrapegooglesearch_model->getMetaTitles());
## make words from sentences
$meta_descriptions_words_array = $this->texttools_model->sentences2words($this->scrapegooglesearch_model->getMetaDescriptions());
## merge meta title and meta description words
$all_words_array = array_merge($meta_titles_words_array, $meta_descriptions_words_array);
## count how often a word appears in the array
$word_results_array = array_count_values($all_words_array);
## make top words list (dus maak nieuwe array met woorden die meer dan 2x voorkomen)
$this->keyword_model->setTopWords($word_results_array);
## set number of keywords
$this->keyword_model->setNumberOfKeywords($this->keyword_model->getTopWords(), $keywords_from_database);
?>
## set keyword for scrape google search model
$this->scrapegooglesearch_model->setKeyword($row->keyword);
## load google search content in
$this->scrapegooglesearch_model->loadHtmlContent();
## make words from sentences
$meta_titles_words_array = $this->texttools_model->sentences2words($this->scrapegooglesearch_model->getMetaTitles());
## make words from sentences
$meta_descriptions_words_array = $this->texttools_model->sentences2words($this->scrapegooglesearch_model->getMetaDescriptions());
## merge meta title and meta description words
$all_words_array = array_merge($meta_titles_words_array, $meta_descriptions_words_array);
## count how often a word appears in the array
$word_results_array = array_count_values($all_words_array);
## make top words list (dus maak nieuwe array met woorden die meer dan 2x voorkomen)
$this->keyword_model->setTopWords($word_results_array);
## set number of keywords
$this->keyword_model->setNumberOfKeywords($this->keyword_model->getTopWords(), $keywords_from_database);
?>
----------------
Nu heb ik dus 2 models : keyword_model en scrapegooglesearch_model
De scrapegooglesearch_model doet dan alle scrape functies van de google resultaten.
En keyword_model doet alle testen om te achterhalen.
Waar het me nou om gaat is dit:
Code (php)
1
2
3
2
3
<?php
$this->keyword_model->setNumberOfKeywords($this->keyword_model->getTopWords(), $this->keyword_model->keywordsFromDatabase());
?>
$this->keyword_model->setNumberOfKeywords($this->keyword_model->getTopWords(), $this->keyword_model->keywordsFromDatabase());
?>
Hier mee wil ik dus bepalen hoeveel van de meest voorkomende woorden (getTopWords) uit het google resultaat in de meta title en description er voorkomen in mijn array $this->keyword_model->keywordsFromDatabase().
In mijn keyword_model heb ik dus een public numberOfKeywords staan.
Deze set ik dmv setNumberOfKeywords()
Deze kan ik later weer op halen met de method getNumberOfKeywords()
Maar is het echt wel nodig om dit in de method op te slaan?
Kan ik in een controller niet gewoon de variable lokaal opslaan in de controller?
Of moet ik in de controller ook weer een public $aantal_keywords aanmaken? :
Code (php)
1
2
3
2
3
<?php
$aantal_keywords = this->keyword_model->calculateNumberOfKeywords($this->keyword_model->getTopWords(), $this->keyword_model->keywordsFromDatabase());
?>
$aantal_keywords = this->keyword_model->calculateNumberOfKeywords($this->keyword_model->getTopWords(), $this->keyword_model->keywordsFromDatabase());
?>
En dan de variable $aantal_keywords in mijn controller gebruiken?
Of moet ik daar echt een getter en setter voor maken?
Later kom ik dit probleem weer tegen wanneer ik uiteindelijk de niche heb bepaald :
-----------------
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
class Keywords extends CI_Controller {
public function generate()
{
## save niche for keyword in database
$this->keyword_model->setKeywordNiche($row->keyword, $this->keyword_model->foundNiche());
## set viewdata
$viewdata['results'][] = array('keyword' => $row->keyword, 'niche' => getKeywordNiche($row->keyword));
}
}
?>
class Keywords extends CI_Controller {
public function generate()
{
## save niche for keyword in database
$this->keyword_model->setKeywordNiche($row->keyword, $this->keyword_model->foundNiche());
## set viewdata
$viewdata['results'][] = array('keyword' => $row->keyword, 'niche' => getKeywordNiche($row->keyword));
}
}
?>
-----------------
of is het beter om het zo te doen??? :
-----------------
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Keywords extends CI_Controller {
public function generate()
{
## save niche for keyword in database
$keyword = $row->keyword
$gevonden_niche = $this->keyword_model->foundNiche();
$this->keyword_model->setKeywordNiche($keyword, $gevonden_niche);
## set viewdata
$viewdata['results'][] = array('keyword' => $keyword, 'niche' => $gevonden_niche);
}
}
?>
class Keywords extends CI_Controller {
public function generate()
{
## save niche for keyword in database
$keyword = $row->keyword
$gevonden_niche = $this->keyword_model->foundNiche();
$this->keyword_model->setKeywordNiche($keyword, $gevonden_niche);
## set viewdata
$viewdata['results'][] = array('keyword' => $keyword, 'niche' => $gevonden_niche);
}
}
?>
-----------------
of zo :
-----------------
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
class Keywords extends CI_Controller {
public $keyword;
public $gevonden_niche;
public function generate()
{
## save niche for keyword in database
$this->keyword = $row->keyword
$this->gevonden_niche = $this->keyword_model->foundNiche();
$this->keyword_model->setKeywordNiche($keyword, $gevonden_niche);
## set viewdata
$viewdata['results'][] = array('keyword' => $keyword, 'niche' => $gevonden_niche);
}
}
?>
class Keywords extends CI_Controller {
public $keyword;
public $gevonden_niche;
public function generate()
{
## save niche for keyword in database
$this->keyword = $row->keyword
$this->gevonden_niche = $this->keyword_model->foundNiche();
$this->keyword_model->setKeywordNiche($keyword, $gevonden_niche);
## set viewdata
$viewdata['results'][] = array('keyword' => $keyword, 'niche' => $gevonden_niche);
}
}
?>
-----------------
Want ik kan me voorstellen als ik resultaten niet steeds in lokale variabellen zet dat het heel onoverzichtelijk word? Zoals hier :
--------------
Code (php)
1
2
3
2
3
<?php
$all_words_array = array_merge($this->texttools_model->sentences2words($this->scrapegooglesearch_model->getMetaTitles(), $meta_descriptions_words_array = $this->texttools_model->sentences2words($this->scrapegooglesearch_model->getMetaDescriptions()));
?>
$all_words_array = array_merge($this->texttools_model->sentences2words($this->scrapegooglesearch_model->getMetaTitles(), $meta_descriptions_words_array = $this->texttools_model->sentences2words($this->scrapegooglesearch_model->getMetaDescriptions()));
?>
----------------
dus dat ik het op deze manier doe :
----------------
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
## make words from sentences
$meta_titles_words_array = $this->texttools_model->sentences2words($this->scrapegooglesearch_model->getMetaTitles());
## make words from sentences
$meta_descriptions_words_array = $this->texttools_model->sentences2words($this->scrapegooglesearch_model->getMetaDescriptions());
## merge meta title and meta description words
$all_words_array = array_merge($meta_titles_words_array, $meta_descriptions_words_array);
?>
## make words from sentences
$meta_titles_words_array = $this->texttools_model->sentences2words($this->scrapegooglesearch_model->getMetaTitles());
## make words from sentences
$meta_descriptions_words_array = $this->texttools_model->sentences2words($this->scrapegooglesearch_model->getMetaDescriptions());
## merge meta title and meta description words
$all_words_array = array_merge($meta_titles_words_array, $meta_descriptions_words_array);
?>
----------------
maar dan zit ik dus weer met het probleem dat ik heel veel lokale variabellen krijg.
Dus kan iemand mij vertellen wat nu de beste werkwijze is?
En/of hoe dit heet want kan er in google weinig over vinden...
Alvast reuze bedankt voor jullie hulp en opmerkingen!
m.v.g.
Chris
Graag volgende keren je php code tussen de php-tags zetten <?php ?>. Alle andere codes tussen de code-tags ([code][/code]
[/modedit]
Gewijzigd op 27/06/2014 18:40:10 door Nick Dijkstra
Ik snap er werkelijk geen snars van maar na het geheel aardig doorgelezen te hebben even het volgende:
Volgens mij gebruik je Models als tussenlaag tussen de database en je applicatie, zeg maar dat het de plek is waar je queries schrijft en gegevens uit de database haalt of naar de database wegschrijft.
Jij probeert Models hele andere dingen te laten doen. CodeIgniter kent ook libraries. Dat zou de plek moeten zijn voor nieuwe classes met een gespecialiseerde taak.
Quote:
Maar is het echt wel nodig om dit in de method op te slaan?
Deze vraag is ook zoiets. Methods zijn functies binnen een class. Je slaat niets op in een method. als de method namelijk doorlopen is dan zijn alle lokale variabelen foetsie. Of je slaat data op in de PROPERTIES van de class of je geeft ze in de RETURN mee naar buiten.
Toevoeging op 27/06/2014 19:06:16:
Quote:
Hallo ik ben nu al tijdje bezig om oop te leren via het mvc model.
Vergeet AUB heel het woord Framework en MVC.
Begin bijvoorbeeld hier: http://www.phptuts.nl/view/45/
Gewijzigd op 27/06/2014 18:30:48 door Frank Nietbelangrijk
Bedankt voor je tijd voor het doorlezen en je reactie.
Heb het zo duidelijk mogelijk proberen uit te leggen maar dus mislukt...
Ik ben ooit begonnen met die tutorial te lezen, daar heb ik al mijn kennis uit.
Maar heb het waarschijnlijk allemaal beetje door de war gegooid in mijn hoofd.
Maar wat ik dus bedoelde zijn PROPERTIES ja.
Hierin kan ik data in opslaan zolang het script draait toch?
Deze moet ik dus data geven en ophalen dmv getters en setters toch?
Verder wilde ik dus weten :
In mijn controller roep ik dus een method aan (uit de keyword_model) welke de niche van het keyword bepaald bijv. calcNiche().
Maar moet ik nu de niche opslaan in de PROPERTIE $niche van het keyword_model.
Zodat ik later via de method bijv. saveNiche() de PROPERTIE niche van keyword_model kan opslaan in de database.
Code (php)
1
2
3
4
2
3
4
<?php
$this->keyword_model->calcNiche(); // om de propertie $niche te setten
$this->keyword_model->saveNiche(); // om de inhoud van property $niche in de db op te slaan.
?>
$this->keyword_model->calcNiche(); // om de propertie $niche te setten
$this->keyword_model->saveNiche(); // om de inhoud van property $niche in de db op te slaan.
?>
Of is het beter om dus NIET de PROPERTIE $niche te gebruiken, maar in de controller het in een variable op te slaan, zoals hier :
Code (php)
1
2
3
4
2
3
4
<?php
$niche = $this->keyword_model->calcNiche(); // bereken het en return de waarde
$this->keyword_model->saveNiche($niche);
?>
$niche = $this->keyword_model->calcNiche(); // bereken het en return de waarde
$this->keyword_model->saveNiche($niche);
?>
Wil dus begrijpen wanneer ik het in de properties moet opslaan of dat ik het gewoon in een variable op kan slaan.
nogmaals bedankt!
Gewijzigd op 27/06/2014 23:35:24 door Chris LM
Omdat ik je code niet al te goed begrijp, ga ik er verder niet te diep op in.
Als niche altijd gecalculeerd moet worden (wat je daar dan ook mee bedoelt) hoort het wellicht thuis in de constructor. Maar zoals Frank al zei, lijkt het me niet onverstandig om eens even wat leeswerk te gaan verrichten.
Ik kan heel erg goed begrijpen dat je termen soms even met elkaar verwart en ik weet als geen ander dat OOP echt niet eenvoudig is om te leren. Alleen de juiste termen/namen gebruiken is voor het juist communiceren natuurlijk wel heel erg belangrijk :-)
Quote:
Maar wat ik dus bedoelde zijn PROPERTIES ja.
Hierin kan ik data in opslaan zolang het script draait toch?
Hierin kan ik data in opslaan zolang het script draait toch?
Ja in PHP klopt dit wel. Voor de volledigheid: Je moet wel je variabele in tact houden die naar de instantie van de class wijst:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$a = new User('Frank'); // maak een nieuwe instantie van de class User aan in het geheugen en zet de verwijzing naar het geheugenadres in de variabele $a.
echo $a->getName(); // print de naam van de user
$a = 'willekeurige variabele'; // overschrijf $a. We verliezen nu onze 'verwijzing' naar de instantie
echo $a->getName(); // FOUTMELDING ( al zweeft de instantie nog wel ergens in het geheugen van de server )
?>
$a = new User('Frank'); // maak een nieuwe instantie van de class User aan in het geheugen en zet de verwijzing naar het geheugenadres in de variabele $a.
echo $a->getName(); // print de naam van de user
$a = 'willekeurige variabele'; // overschrijf $a. We verliezen nu onze 'verwijzing' naar de instantie
echo $a->getName(); // FOUTMELDING ( al zweeft de instantie nog wel ergens in het geheugen van de server )
?>
Toevoeging op 28/06/2014 00:25:51:
Quote:
Deze moet ik dus data geven en ophalen dmv getters en setters toch?
Ja.
Quote:
Maar moet ik nu de niche opslaan in de PROPERTIE $niche van het keyword_model.
Zodat ik later via de method bijv. saveNiche() de PROPERTIE niche van keyword_model kan opslaan in de database.
Zodat ik later via de method bijv. saveNiche() de PROPERTIE niche van keyword_model kan opslaan in de database.
Kijk hier wordt het interessant.
Zie een class als de blauwdruk van een object. Kijk bijvoorbeeld eens naar je eigen computer monitor. dat is een object uit het dagelijks leven. Dit object is ooit ontworpen, wellicht met een technische tekening en een lange technische omschrijving. Daarna is er een prototype van gemaakt en na een aantal wijzigingen is deze in productie gegaan en zijn er duizenden van gemaakt.
Met classes precies zo.
Je code
is het ontwerp. Wanneer het ontwerp goed genoeg is kun je deze oneindig blijven gebruiken om nieuwe instanties aan te maken (nou ja oneindig.. tot je server gaat flippen door geheugenruimte gebrek).
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$a = new User('Frank');
$b = new User('Chris');
$c = new User('Wouter');
$d = new User('Aar');
....
?>
$a = new User('Frank');
$b = new User('Chris');
$c = new User('Wouter');
$d = new User('Aar');
....
?>
Bij al deze instanties kan dus een andere username opgegeven worden die wordt opgeslagen in een property!!!
Dus om een klein beetje antwoord op je vraag te geven: als je de niche opslaat in een property van een instantie van je class dan kan je dus in een andere instantie een andere niche opslaan.
Wil je dat? Ik weet het niet.
Wat je heel erg goed moet onthouden is dat een class maar één verantwoordelijkheid mag hebben.
dus als je van een class gaat zeggen dat ie verantwoordelijk is voor ... EN voor ... dan zit je fout.
Gewijzigd op 28/06/2014 00:29:59 door Frank Nietbelangrijk
En frank door je laatste reactie is het kwartje gevallen.
Het probleem is denk ik geweest dat ik gelijk met codeigniter ben begonnen.
Kom er nu achter dat ik daarin helemaal geen new Object($var) in gebruik...
Ga eerst maar eens zonder framework beginnen.
Goed plan... eerst maar eens de basis onder de knie krijgen, dan ben je al een paar maandjes verder ;)
Succes!
Denk inderdaad dat dat het beste is. Daarna een klein projectje in CI om kennis te maken met een MVC framework en dan adviseer ik je de springplank te nemen naar een framework als Laravel, Symfony of Zend.