OOP gedachtengang

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

New business developer

You will start working as new business developer for the German, Swiss and Austrian market. You will receive a direct contract from the company. It is a fulltime job for 35 hours a week. Salary is based on previous experience. What we offer Salary based on experience Contract from company itself Who you are Do you recognize yourself in the following? You have at least a Bachelor degree in marketing Experience in a similar position Native speaker in German Excellent analytical and research skills Pro-active and result minded with teamwork skills What will you do You will start working as

Bekijk vacature »

Logistiek Developer / PL/SQL / API's / integratie

Bedrijfsomschrijving Voor een organisatie in regio Tilburg zijn wij op zoek naar een Technisch Logistiek Engineer. Het gaat om een internationaal bedrijf met duizenden medewerkers waarvan ongeveer duizend in Nederland. Ze werken met het WMS JDA Dispatcher De organisatie heeft een informele sfeer en medewerkers worden gemanaged op verantwoordelijkheden en niet op dagelijkse taken. Tevens wordt eigen initiatief, ambitie en ondernemerschap gestimuleerd en gewaardeerd. Mocht je een idee hebben of een verbeterpunt dan mag je dit altijd aankaarten en is de kans groot dat, wanneer het waarde toevoegt voor de organisatie of het proces, dit ook wordt goed gekeurd. De

Bekijk vacature »

Applicatie engineer

Ben jij een teamplayer en krijg je energie van het ontwerpen, verbeteren en onderhouden van nieuwe en bestaande IT-systemen bij onze klanten? Wil je jouw ICT-kennis optimaal inzetten én verder uitbreiden? Lees dan zeker even verder! Als Applicatie engineer bij NEH onderhoud je de automatiseringssystemen en IT-applicaties die in beheer zijn van NEH. Daarnaast ontwerp en realiseer je ook nieuwe systemen of breng je verbeteringen aan in bestaande systemen en de relevante onderliggende interfaces tussen deze systemen. Bij de start van je carrière bij NEH begin je met een specifieke klus via een partner van NEH. Dit betreft het patchen

Bekijk vacature »

Software Developer / PHP

Bedrijfsomschrijving Voor de een commercieel bedrijf met een focus in de zorgwereld zijn wij op zoek naar een Software Developer met goede kennis van PHP. Het betreft een groeiende en open organisatie in regio Zuid-Limburg. Het bedrijf bestaat uit meerdere locaties en ongeveer 300 medewerkers. De ICT afdeling werkt vanuit regio Maastricht en bestaat uit subteams, gericht op IT beheer, Data en Development. Je werkt in het Development team samen met vier collega's. De sfeer op de afdeling is erg goed. Men weet elkaar te vinden en er heerst een informele sfeer waar ruimte is voor eigen inbreng en gezelligheid.

Bekijk vacature »

Cloud Solution Architect - Banking

Cloud Solution Architect - Banking Functiebeschrijving: Developments in the field of IT continue to accelerate. Digital transformation and thereby the migration and delivery of services in the Cloud is an important theme that our customers are increasingly working on in order to maintain or further strengthen their position in the market. Do you want to contribute to this shift as a Cloud Solution Architect? Your day-to-day activities As a Cloud Solution Architect you are part of a passionate club of professionals. You are responsible for (part of) the design of one or more systems. This role requires communication and interaction

Bekijk vacature »

BI/SQL developer met uitstekende voorwaarden!

Bedrijfsomschrijving Mijn klant is een financiële dienstverlener gevestigd in Amersfoort. Ze hebben vestigingen in diverse landen en er werken momenteel ruim 500 mensen wereldwijd. Ze bieden een breed divers dienstenpakket aan. De afdeling waarin jij komt te werken bestaat uit 5 SQL-server/Business Intelligence specialisten. Het betreft een interne functie op een vaste werklocatie in een fijne omgeving. Tevens zijn de arbeidsvoorwaarden binnen deze organisatie uitstekend te noemen. Waaronder een vaste 13e maand. Functieomschrijving Mijn klant is op zoek naar een ervaren SQL-server database ontwikkelaar, met bij voorkeur kennis van Microsoft Business Intelligence tooling. Het team waarin je werkzaam wordt bestaat

Bekijk vacature »

Ervaren full-stack C# developer, .NET CORE, Typesc

Voor een ambitieuze en snelgroeiende organisatie de regio Rotterdam zijn we momenteel op zoek naar een .NET C# developer. De organisatie bestaat inmiddels ruim 15 jaar en heeft een systeem ontwikkeld waarmee bedrijven de informatie van grote en complexe projecten beter kunnen managen. Dit systeem is geheel webbased. Om hun globale ambities waar te maken zijn ze recentelijk begonnen het systeem geheel te herbouwen met de nieuwste technieken. Denk hierbij aan technieken als .NET CORE, Typescript, React, Kubernetes en Azure. Niet alleen betekent voldoende nieuwe technische uitdaging maar ook betekent dit dat je voor 80 tot 90% van je tijd

Bekijk vacature »

Senior .NET Developer Datawarehouse

Senior .NET Developer Datawarehouse Bouw jij graag mee aan de nieuwe generatie van het datawarehouse-framework voor de zorg? En kent programmeren in C# geen geheimen voor jou? Dan pas jij perfect in ons team in Amsterdam. We bieden jou de kans om complexe uitdagingen op te lossen en te werken met de nieuwste technieken. Jouw baan Zorgprofessionals nemen belangrijke beslissingen op basis van data uit ons Datawarehouse. Als .NET Developer Datawarehouse ontwikkel jij een nieuwe generatie van het achterliggende framework. Je werkt dagelijks met zeer grote en complexe datasets en krijgt te maken met uitdagende issues, waarbij diepgaand onderzoek nodig

Bekijk vacature »

.NET Developer PACS / Multimedia

Wil jij met jouw ontwikkelskills medisch specialisten het optimale uit beeldmateriaal laten halen? Dan is dit jouw droombaan! Ter versterking van ons PACS-team in Amsterdam zoeken wij een ontwikkelaar die verantwoordelijkheid krijgt over zijn ‘eigen’ software. Jouw baan In deze functie ga je medische apparatuur (ECG\echo\OCT\MRI\Etc) integreren in ons EPD. Jij houdt je daarnaast bezig met het maken van software om de verschillende output-formaten van de apparatuur te ondersteunen en te presenteren aan medische specialisten. Tevens ben je verantwoordelijk voor het ontwerpen, ontwikkelen, ondersteunen en onderhouden van je eigen PACS-tools (Picture Archiving and Communication System). Die tools integreer je feilloos

Bekijk vacature »

Project Management Ondersteuner (PMO) - Publieke V

Functiebeschrijving: Ben jij een betrokken PMO professional die de klant ondersteunt, ontzorgt en van aanpakken weet? Een echte meedenker die ziet wat er moet gebeuren en snel actie onderneemt? In deze uitdagende rol ben je mede verantwoordelijk voor de realisatie van complexe projecten en oplossingen binnen het veiligheidsdomein. Wat ga je doen? Als Project Management Ondersteuner (PMO) zorg je voor een goede en kwalitatieve projectadministratie. Je werkzaamheden zullen bestaan o.a. uit: Het bewaken van de richtlijnen van issuemanagement voor de projecten; Het assisteren van de projectmanagers bij het opstellen van de projectplanningen en communicatieplannen en het bewaken hiervan; Het inbedden

Bekijk vacature »

Microsoft 365 Engineer Welkomstbonus € 5.000,

Microsoft 365 Engineer senior Welkomstbonus van € 5.000,- Bij T2 zorgen we goed voor elkaar en doen wij leuke dingen met leuke mensen. We zorgen voor uitdagende opdrachten zodat jij jezelf onbeperkt kan blijven ontwikkelen. Ben jij een ervaren systeembeheerder Microsoft 365 en wil je het beste uit jezelf halen? Dan ben je van harte welkom bij T2 en ontvang je onze welkomstbonus ter waarde van € 5.000,-. Er werken leuke mensen bij T2, die op een professionele en informele wijze met hun carrière en collega’s omgaan. Dat is de basis voor succes! Het is vanzelfsprekend dat je met de

Bekijk vacature »

C# .NET Developer

Bedrijfsomschrijving Je komt terecht bij een innovatieve en dynamische organisatie, die gespecialiseerd is in het ontwerpen, bouwen en implementeren van systemen voor gebruik binnen (semi-)industriële omgevingen. Het is een organisatie met meer dan 15 jaar ervaring in de industriële branche. Tevens zijn ze een ervaren en betrouwbare partner die "state of the art" oplossingen biedt. De systemen worden wereldwijd door organisaties gebruikt en zijn volledig geautomatiseerd. De systemen zijn via het web toegankelijk gemaakt door diverse .NET oplossingen. De oplossingen die worden aangeboden worden gekenmerkt door hun soliditeit en betrouwbaarheid. Bij deze organisatie wordt er veel waarde gehecht aan een

Bekijk vacature »

Front-end Ontwikkelaar

Bedrijfsomschrijving Bij het accepteren van dit aanbod kom je terecht binnen een veelzijdige organisatie waar een goede sfeer hangt. Zij zijn gewend dagelijks met elkaar te lunchen en ruimte is voor een potje Mario. Als Front-end ontwikkelaar ga je je op projectbasis bezighouden met het ontwikkelen van content voor diverse opdrachtgevers. De projecten waar je aan gaat werken zullen verschillende qua omvang. Hierbij kan je rekening houden met een gemiddelde doorlooptijd van een half jaar, waarbij er meerdere projecten naast elkaar kunnen lopen. Naast ontwikkeling aan de Front-end ga je ook een rol spelen bij de ontwikkeling aan de back-end.

Bekijk vacature »

.NET backend developer, afwisselende projecten, ve

Voor een detacheerder in de regio Rotterdam zijn we op zoek naar een ervaren .NET developer. Het bedrijf bestaat uit circa 100 medewerkers waarvan 10 .NET developers. Dit zijn voornamelijk senior .NET developers. Omdat je via deze werkgever gedetacheerd wordt bij hun klanten, is werk afhankelijk van de opdracht waar je terechtkomt. Dit kan zijn bij een grote verzekeraar maar ook een bouwbedrijf of gemeente. Niet alleen betekent dit om de zoveel tijd (bijvoorbeeld 1 jaar) een nieuwe technische uitdaging maar ook een nieuwe omgeving waarin je terecht komt. Naast de afwisseling in je werk biedt dit bedrijf uitstekende opleidingsmogelijkheden.

Bekijk vacature »

Technisch Consultant Datamigratie

Technisch Consultant Datamigratie Ben jij een doorzetter die zich vooral wil verdiepen in de technische aspecten rondom een ZIS-migratie? Grijp dan nu je kans! Wij zoeken een perfectionistische en pragmatische Technisch Consultant Datamigratie, die vanuit het hoofdkantoor in Amsterdam zorginstellingen helpt bij de overstap naar een fonkelnieuw zorginformatiesysteem (ZIS). Jouw baan Je steekt je energie vooral in het onderhouden en uitbouwen van migratiescripts, frameworks en rapportages. Daarnaast is het inrichten van de conversieprogrammatuur een belangrijke taak. Je laat de conversie foutloos verlopen, waarbij je garant staat voor de performance en kwaliteit. Je werkt zo’n 90% op kantoor en de rest

Bekijk vacature »

Pagina: « vorige 1 2 3 4 5 volgende »

Jasper DS

Jasper DS

06/06/2012 15:25:49
Quote Anchor link
Maar waarom staat deze regel daar nu in die functie?
 
PHP hulp

PHP hulp

23/01/2021 18:31:15
 
Jeroen VD

Jeroen VD

06/06/2012 15:29:50
Quote Anchor link
hetzelfde als met gewoon database gebruik:

bij procedurele queries moet je eerst fetchen, en komt er een array uit, of een object, of net wat je zelf wilt. je zult dan wel nog jouw benodigde gegevens uit die array of object moeten halen.

hetzelfde hier, $result is alleen nog maar gefetcht. en is een array. dus met $result['id'] haal je het id uit de array.
 
Jasper DS

Jasper DS

06/06/2012 15:30:36
Quote Anchor link
en waarom zou ik dat willen doen in die desbetreffende functie?
 
Jeroen VD

Jeroen VD

06/06/2012 15:36:31
Quote Anchor link
hmm das inderdaad gek ja. ik dacht dat je de regel niet begreep, maar ik snap zelf het nut eigenlijk ook niet, nee.
 
Jasper DS

Jasper DS

06/06/2012 15:42:11
Quote Anchor link
Ik begreep de syntax en de inhoud wel maar de bedoeling niet. ;)
 
Erwin H

Erwin H

06/06/2012 15:55:29
Quote Anchor link
Zo te zien komt het omdat het id niet wordt opgehaald uit de database:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT name, password, email, logged_in FROM users WHERE id = ?

Het id is namelijk al bekend en hoef je dus niet uit de database te halen, maar kan je direct in het object zetten. Anders zou je in het select ook 'id' moeten opnemen in de kolomnamen.
 
Wouter J

Wouter J

06/06/2012 16:29:34
Quote Anchor link
Erwin's uitleg klopt inderdaad. Ik heb altijd het gevoel alsof de manier die ik hier gebruik sneller is als het ophalen uit de DB en dus doe ik het altijd zo, maar kan er ook naast zitten.

Tevens, waarom de id niet in de constructor? Omdat een User niet verplicht een ID heeft. Als je een nieuwe user aanmaakt weet je nog geen ID, je hebt immers alleen het object. Pas als je het in de DB plaats met de UserMapper weet je het ID en die moet je dus apart kunnen zetten. (dat zie je ook automatisch gebeuren in UserMapper::create(). Daar zie je dat na het aanmaken van de User de User::setId() method wordt aangeroepen en de user het laatst aangemaakte ID krijgt (weet niet of die regel helemaal klopt in het script, maar gaat om het idee).

Quote:
En moet er telkens aangeduid worden welk type? Ik dacht dat dat in php niet hoefde in tegenstelling tot andere programmeertalen zoals java en C.

Dat klopt. Alleen ik hou altijd van controle. In een klasse wil ik zeker weten dat de waarde van de properties de waarde hebben die ik verwacht, vandaar dat ik ze allemaal typecast. Ik noem het maar een goede gewoonte.
 
Roel -

Roel -

06/06/2012 19:43:11
Quote Anchor link
Wouter, heb je misschien een voorbeeld in de praktijk van hoe je nu bijv. je User class verwerkt i.c.m. een form en validatie? Dat is mij nog niet helemaal duidelijk namelijk.
 
Wouter J

Wouter J

06/06/2012 19:50:31
Quote Anchor link
Het is eigenlijk gewoon heel simpel:
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
26
27
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $errors = array();

    if (!(isset($_POST['name'])) || ($_POST['name'] === '')) {
        $errors[] = 'Je bent vergeten een username in te vullen.';
    }

    if (!(isset($_POST['password'])) || ($_POST['password'] === '')) {
        $errors[] = 'Je bent vergeten een wachtwoord in te vullen.';
    }

    if (!(isset($_POST['email'])) || ($_POST['email'] === '')) {
        $errors[] = 'Je bent vergeten een email adres in te vullen';
    }


    if (count($errors) > 0) {
        // geen fouten, registreer user
        // maak een User object aan

        $user = new User($_POST['name'], $_POST['password'], $_POST['email']);
        $userMapper = new UserMapper();

        $user = $userMapper->create($user);

        $message = 'Hallo '.$user->getName().', welkom op deze website!';
    }
}

// ...
?>


Eventueel zou je het formulier validatie ook kunnen laten doen door een Form klasse, maar dat gaat wel erg ver voor dit topic (en om eerlijk te zijn heb ik dat zelf ook nog niet helemaal door...).
 
Roel -

Roel -

06/06/2012 20:03:26
Quote Anchor link
Je gebruikt dus geen try ... catch constructies? Het is me nu een stuk duidelijker.
Bedankt :-)
 
Wouter J

Wouter J

06/06/2012 22:46:24
Quote Anchor link
Niet voor foutafhandeling van dingen de de gebruiker verkeerd doet. Of nou, nu ik het zeg. Het kan natuurlijk ook:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if (...) {
    $errors = array();
    if (!isset(...)) {
        $errors[] = 'Je moet nog een naam invullen';
    }

    // ...

    if (count($errors) > 0) {
        throw RunTimeException(implode(', ', $errors));
    }
}

?>


Maar het lijkt me handiger om RunTime fouten af te handelen met gewone normale error systemen, omdat je meerdere fouten tegelijkertijd wilt tonen.
 
Jasper DS

Jasper DS

07/06/2012 17:31:13
Quote Anchor link
Nu ben ik mij aan het afvragen hoe ik de login functie maak. Eerst en vooral ga ik niet opslaan in de database of mijn user ingelogged is aangezien dat in mijn applicatie niet belangrijk is.

Nu was ik aan het denken om aan mijn User class een functie login() toe te voegen en aan mijn UserMapper een functie getByNameAndPass(). In de login functie word de sessie dan aangemaakt en de getByNameAndPass() checkt of de user bestaat en populate() hem als die bestaat zodat ik kan inloggen.

Zit ik juist?
 
Wouter J

Wouter J

07/06/2012 17:52:47
Quote Anchor link
Heel strict genomen mag een User object zelf geen login uitvoeren en heb je daar een eigen klasse voor nodig. Maar ik denk dat het in dit geval wel goed zou zijn.
 
Jasper DS

Jasper DS

07/06/2012 19:06:44
Quote Anchor link
@Wouter, er loopt toch iets mis in mijn logica.

PRODUCELE CODE:
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
<?php
try
{
    $db = new PDO('mysql:host=localhost;dbname=visit_report','root','***');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Set Errorhandling to Exception
}    
catch(PDOException $e)
{

    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

    
$userMapper = new UserMapper($db);
$user = new User('jasper' , sha1('test'));
echo $userMapper->getByNameAndPass($user);
echo 'Id: ' . $user->getId();
echo '<br/> Name: ' . $user->getName();
echo '<br/> Password: ' .$user->getPassword();
?>


UserMapper->getByNameAndPass(User $user)
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
<?php
public function getByNameAndPass(User $user)
    {

        $stmt = $this->db->prepare("SELECT COUNT(gebruikersid) AS tel, gebruikersid, naam, wachtwoord FROM gebruikers WHERE naam = :name and wachtwoord = :password");

        $stmt->execute(array(
            ':name' => $user->getName(),
            ':password' => $user->getPassword()
        ));

    
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if($result['tel'] < 1)
        {

            return 'Geen resultaat gevonden';
        }

        else
        {
            return $this->populate($result);
        }    
    }

?>


Zoals je ziet return mijn functie 'Geen resultaat gevonden' als de gegevens niet kloppen maar als het wel klopt returnt de functie de populate functie die op zijn beurt een volledig object return waardoor ik volgdende fout krijg.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Catchable fatal error: Object of class User could not be converted to string in C:\xampp\htdocs\testjes\User.class.php on line 150
 
Jurgen B

Jurgen B

07/06/2012 20:16:03
Quote Anchor link
Je probeert op regel 14 getByNameAndPass($user) te echoen, wat niet gaat omdat deze functie een User object teruggeeft. Het zou wel kunnen maar dan moet je een toString functie maken (dit kan bij Java, neem aan ook bij PHP).

Dus je wilt de return asignen aan een variabele welke je vervolgens kan echoen zoals je in de regels daaronder al deed. Echter echo je daar de gegevens van de $user die je zelf aanmaakt (jasper) ipv het resultaat van je query.
 
Wouter J

Wouter J

07/06/2012 20:18:02
Quote Anchor link
Jurgen, in PHP heb je de __toString magic method.

Jasper, ik zou het wat anders doen. Als er iets fout gaat return je false en anders de User object. Errors handel je met Exceptions af.
 
Jasper DS

Jasper DS

07/06/2012 22:37:40
Quote Anchor link
Dan veronderstel ik op deze manier:

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
<?php
public function getByNameAndPass(User $user)
    {

        $stmt = $this->db->prepare("SELECT COUNT(gebruikersid) AS tel, gebruikersid, naam, wachtwoord FROM gebruikers WHERE naam = :name and wachtwoord = :password");

        $stmt->execute(array(
            ':name' => $user->getName(),
            ':password' => $user->getPassword()
        ));

    
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if($result['tel'] < 1)
        {

            return false; // Geen resultaat gevonden
        }
        else
        {
            return $this->populate($result);
        }    
    }

?>


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
<?php
/* Login testen */

try
{
    $db = new PDO('mysql:host=localhost;dbname=visit_report','root','jasper');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Set Errorhandling to Exception
}    
catch(PDOException $e)
{

    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

    
$userMapper = new UserMapper($db);
$user = new User('jasper' , sha1('test'));
if($userMapper->getByNameAndPass($user) == false)
{

    echo 'Uw gegevens zijn niet correct.';
}

echo 'Id: ' . $user->getId();
echo '<br/> Name: ' . $user->getName();
echo '<br/> Password: ' .$user->getPassword();
?>
 
Wouter J

Wouter J

07/06/2012 22:39:20
Quote Anchor link
Ja, alleen doe je nu niks met de geretourneerde user klasse. Sla deze op in $user.
 
Jasper DS

Jasper DS

11/06/2012 21:13:01
Quote Anchor link
Zo, nu heb ik eigenlijk een simpel "inlog systeempje" in de OOP vorm. :-)
Dan nu het degelijk opslaan van mijn classes. Ik heb voorlopig 2 classes. De User en de Usermapper. Zet ik deze in 2 apparte bestanden of wat doe ik daarmee? Moet ik dan ook telkens al mijn classes inladen of laad ik deze in in één bestand dat ik nadien inlaad in mijn andere pagina's?
 
Wouter J

Wouter J

11/06/2012 21:54:18
Quote Anchor link
Jasper, je plaats elk bestand in een aparte bestand en ook in aparte mappen op categorie. Dus zeg maar zoiets:
/project/
/project/lib/User/User.php
/project/lib/User/UserMapper.php
/project/lib/Post/Article.php
/project/lib/Post/PostMapper.php
/project/lib/Post/PostFactory.php
/project/lib/Post/BlogPost.php

Dan kun je mooi en makkelijk gaan werken met autoloaders. Zorg dat je klassennamen de PSR-0 standaard volgen en je kunt heel simpel hun spl autoloader gebruiken. Dat werkt dan ong. 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
<?php
function my_spl_autoloader($class)
{

    // functie wordt elke keer bij het aanmaken van
    // een onbekende klasse aangeroepen, zodat je de
    // klasse kunt laden

    // do some fancy stuff

    // laad het bestand

    require __DIR__.DIRECTORY_SEPARATOR.$class;
}


// registreer de autoloader
spl_autoload_register('my_sql_autoloader');
?>
 

Pagina: « vorige 1 2 3 4 5 volgende »



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.