OOP gedachtengang

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 4 5

Wouter J

Wouter J

26/06/2012 20:13:02
Quote Anchor link
Nee, ik denk dat je Namespaces niet erg onder de knie hebt. Lees eens wat in over namespaces, zoals bijv. hier.
 
PHP hulp

PHP hulp

23/09/2019 10:09:16
 
Roel -

Roel -

26/06/2012 20:32:24
Quote Anchor link
Ik snap het inderdaad niet nee, en de website ook niet echt goed.
Ik heb nu dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
- Source Files
  - classes
     - User.php
     - UserMapper.php
  index.php

User.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
namespace User\User;

class User
{
    // code
}
?>

UserMapper.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
namespace User\UserMapper;

class UserMapper
{
    // code
}
?>

index.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
use User\User;
use User\UserMapper;

// code
?>
[/code
Ik snap er geen bal meer van nu.
Gewijzigd op 26/06/2012 20:35:59 door Roel -
 
Wouter J

Wouter J

26/06/2012 20:53:37
Quote Anchor link
Kijk als je een gewoon script maakt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
function myFunc() {
    return 'Lorem ipsum';
}

class Foo
{
    public function bar()
    {

        return 'Foo....bar!!!';
    }
}

?>

Dan staat dit allemaal in 1 scope, de global scope. Dat is de \ namespace.

Meteen namespace deel je een stukje script op in een bepaalde categorie. Het is ong. te vergelijken als je heel veel berichten hebt:
- beginnen-met-HTML
- Objectief-leren-denken
- psychologie-voor-gevorderden
- Ruby-en-SQL
- CSS-icm-HTML
- ...

Als je deze berichten nu in verschillende categorieën opdeelt wordt het een stuk overzichtelijker:
HTML
- beginnen-met-HTML
- CSS-icm-HTML
Scripting
- Objectief-leren-denken
- Ruby-en-SQL
Overig
- psychologie-voor-gevorderden
- ...

Zo werken namespaces ook. Je deelt de klassen, functies en variabele op in verschillende categoriën. Alles van de User gaat in de User namespace en alles dat te maken heeft met berichte in de Post namespace.

Een namespace definieer je door 'namespace naam-v-d-namespace' te doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
namespace Post;

class BlogPost
{
    // ...
}
?>


Als je nu in een bestandje deze klasse wilt gaan gebruiken zul je 2 dingen moeten doen: of je gaat in dezelfde namespace zitten als de klasse of je moet de namespace definiëren waarin de klasse zit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
require_once 'Post/BlogPost.php';

$blogPost = new Post\BlogPost('Foobar title');
?>

Hierin wordt de klasse BlogPost in de namespace Post gepakt.

De standaards wijzen voor dat het beter is om je namespace zo op te delen: ProjectName\Categorie\Categorie1\... Het wordt dan dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
namespace WjCMS\Post;

class BlogPost
{
    // ...
}
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
require_once 'Post/BlogPost.php';

$blogPost = new WjCMS\Post\BlogPost();
?>

Nu wordt dit natuurlijk heel veel typwerk. Daarom hebben ze in PHP 'use' bedacht, daarmee kan je een alias maken voor een namespace:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
require_once 'Post/BlogPost.php';

use WjCms\Post as WjPost; // alias WjPost voor de namespace WjCms\Post

$blogPost = new WjPost\BlogPost();
?>


Begrijp je het nog?
Want nu heeft PHP het nog makkelijker voor je gemaakt! Je kan namelijk ook achter het use keyword de namespace + klassenaam plaatsen. Dan zal telkens die klassenaam worden gezocht in die namespace:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
require_once 'Post/BlogPost.php';

use WjCms\Post\BlogPost;

$blogPost = new BlogPost();
?>

Dit maakt het dus allemaal veel makkelijker voor je, maar is in feite niks anders dan die lange new WjCms\Post\BlogPost(); van een paar scriptjes geleden.

Nu hebben een paar genies bedacht dat je die namespaces natuurlijk ook mooi kan omzetten om te gaan autoloaden, dit heeft dus niet iets met elkaar te maken. Een autoload functie (of klasse) wordt aangeroepen als je een klasse instantiërt (met new ...()) en die klasse bestaat nog niet.
Dan zet een PSR-0 autoloader de namespace + klassenaam om in een filepath. Een PSR-0 autoloader zal WjCms\Post\BlogPost omzetten naar WjCms/Post/BlogPost.php.
Hierdoor zal je het bestand dus in de map WjCms/Post/BlogPost.php moeten verplaatsen.
 
Jasper DS

Jasper DS

02/07/2012 15:17:11
Quote Anchor link
Niels, ik snap het Row Data Gateway Pattern nog niet erg goed... :S

Mijn functie fetchAll ziet er zo uit in mijn mapper:
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
public function fetchAll()
    {

        $resultSet = $this->getDbTable()->fetchAll();
        $entries   = array();
        foreach ($resultSet as $row)
        {

            $entry = new Application_Model_Client();
            $entry->setId($row->klantid)
                  ->
setName($row->klantnaam);
            $entries[] = $entry;
        }

        return $entries;
    }

?>


Hoe zou deze eruit moeten zien met dat pattern als ik de rowClass toevoeg aan het dbTable object?
 

Pagina: « vorige 1 2 3 4 5



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.