Getters & Setters en variabellen in (Codeigniter) MVC

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Chris LM

Chris LM

27/06/2014 14:00:37
Quote Anchor link
Hallo ik ben nu al tijdje bezig om oop te leren via het mvc model.
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
?>

----------------

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$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)
PHP script in nieuw venster Selecteer het PHP script
1
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));
 }
}

?>

-----------------

of is het beter om het zo te doen??? :

-----------------
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
 }
}

?>

-----------------

of zo :

-----------------
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
 }
}

?>

-----------------

Want ik kan me voorstellen als ik resultaten niet steeds in lokale variabellen zet dat het heel onoverzichtelijk word? Zoals hier :

--------------
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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()));
?>

----------------

dus dat ik het op deze manier doe :

----------------
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>

----------------

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
 
PHP hulp

PHP hulp

23/11/2024 15:59:46
 
Frank Nietbelangrijk

Frank Nietbelangrijk

27/06/2014 18:28:41
Quote Anchor link
ehh wat moet ik met een bericht als deze?

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
 
Chris LM

Chris LM

27/06/2014 23:32:40
Quote Anchor link
Beste Frank,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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.
?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$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
 
Ozzie PHP

Ozzie PHP

27/06/2014 23:43:12
Quote Anchor link
Je moet je afvragen of iets een eigenschap (property) is van het object. Een property moet je telkens kunnen opvragen.

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.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

28/06/2014 00:06:23
Quote Anchor link
Hoi Chris,

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?


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)
PHP script in nieuw venster Selecteer het PHP script
1
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 )

?>



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.


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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
class User{
    private $name;
    // ...
}
?>

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$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
 
Chris LM

Chris LM

29/06/2014 16:47:10
Quote Anchor link
Ozzie bedankt voor je reactie!
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.
 
Ozzie PHP

Ozzie PHP

29/06/2014 17:34:13
Quote Anchor link
>> 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!
 
Frank Nietbelangrijk

Frank Nietbelangrijk

29/06/2014 21:58:58
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.