Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

[PHP] Variabele afschermen in klasse?

InZane
18 antwoorden
  • Stel je hebt een stuk code als volgt:[code:1:34d162e47c]<?php

    class myClass {

    $lengte = 1; // Standaard
    $breedte = 1; // Standaard
    $oppervlakte = $lengte * $breedte;

    function setLengte($l){
    $this->lengte = $l;
    $this->oppervlakte = $this->lengte * $this->breedte;}

    function setBreedte($b){
    $this->breedte = $b;
    $this->oppervlakte = $this->lengte * $this->breedte;}

    function getOppervlakte(){
    return $this->oppervlakte;}

    }
    ?>[/code:1:34d162e47c]De code is natuurlijk niet echt afdoende (geen controle op negatieve getallen e.d.), maar voor deze vraag verder prima. Mocht ik deze klasse aanmaken in PHP dan doe ik dit als volgt:[code:1:34d162e47c]include("myclasses.php");
    $mijnKlasse = new myClass();[/code:1:34d162e47c]Tot zover alles goed, maar nu kan ik direct de variabelen in de klasse aanspreken en veranderen, wat tot ongewenste resultaten leidt:[code:1:34d162e47c]// Manieren om een resultaat te krijgen.
    echo $mijnKlasse->oppervlakte;
    echo $mijnKlasse->getOppervlakte();

    // Manieren om een nieuwe waarde te schrijven.
    $mijnKlasse->setBreedte(8); // Nieuwe breedte is 8, oppervlakte ook!
    $mijnKlasse->lengte = 6; // Nieuwe lengte is 6, maar oppervlakte blijft 8!

    // Oppervlakte opvragen.
    echo $mijnKlasse->getOppervlakte(); // Retourneert "8" ipv "48"…[/code:1:34d162e47c]Zoals je ziet gaat het dus mis bij het direct aanspreken van de variabelen. Nu snap ik ook wel dat je het dan gewoon niet moet doen, maar een mens blijft een mens en maakt dus fouten. Is er een manier om net zoals in Java bepaalde variabelen in een klasse private te maken? Op deze manier kan je dan namelijk écht OO programmeren en dat zou fantastisch zijn.

    En een gerelateerde vraag: kent PHP het principe van constructors en kan je voor dezelfde klasse meerdere construcors maken, uiteraard met een verschillend aantal variabelen, zoals dat ook in Java kan? Of is dit iets te veel van het goede?

    Iedereen alvast bedankt,

    Bas.
  • Private bestaat niet in PHP, het wordt aangeraden om daarvoor $_variable te gebruiken zodat het in ieder geval duidelijk is voor jezelf…

    Ook meerdere constructors werken niet, standaard schijnt dan de laatst gedefinieerde genomen te worden (met alle gevolgen van dien). Lees de user comments maar eens, daar staat ook een workaround (een vrij ranzige trouwens).
  • Zo te zien gaan ze er in php 5 er wat aan doen:

    [quote:5f64741783]
    The PHP5 object model has been revamped adding a lot of features that will give PHP5 a Java flavour. The following section of this article will describe this new object model and some quick examples that you can use as a starting point for your experiments.
    * Constructors and destructors
    * Objects as references
    * Cloning objects
    * Private, Public and Protected keywords
    * Interfaces
    * Abstract classes
    * __call
    * __set and __get
    * Static members
    [/quote:5f64741783]
    bron:http://www.phpbuilder.com/columns/argerich20030411.php3
  • [quote:2d6282a582="Timonsweb"]Zo te zien gaan ze er in php 5 er wat aan doen: […][/quote:2d6282a582]Nice! :D

    - Bas
  • berekening v/d oppervlakte dient, denk ik, sowieso in getOppervlakte() (= computed field) te geschieden ipv tijdens het setten van de lengte & of breedte

    [code:1:4c4fa9cd70]
    public class MyClass {
    protected double lengte;
    protected double breedte;

    public void setLengte(double lengte) {
    this.lengte = Math.max(lengte, .0);
    }

    public void setBreedte(double breedte) {
    this.breedte = Math.max(breedte, .0);
    }

    public double getOppervlakte() {
    return lengte * breedte;
    }
    }[/code:1:4c4fa9cd70]
  • [quote:420f36fde6="cim"]berekening v/d oppervlakte dient, denk ik, sowieso in getOppervlakte() (= computed field) te geschieden ipv tijdens het setten van de lengte & of breedte[/quote:420f36fde6]Daar heb je helemaal gelijk in, maar het was een voorbeeld uit de losse pols geschreven ter illustratie van mijn probleem. Nu wachten tot PHP5 uitkomt en door mijn host op de server wordt geïnstalleerd… Kan haast niet wachten!

    :D

    - Bas
  • Eindelijk eens een vraag over OOP 8) (Hopelijk volgen er meer :wink: )

    [quote:e146b75fba="BasHamar"]Tot zover alles goed, maar nu kan ik direct de variabelen in de klasse aanspreken en veranderen, wat tot ongewenste resultaten leidt…*knip*…Zoals je ziet gaat het dus mis bij het direct aanspreken van de variabelen. Nu snap ik ook wel dat je het dan gewoon niet moet doen, maar een mens blijft een mens en maakt dus fouten. Is er een manier om net zoals in Java bepaalde variabelen in een klasse private te maken? Op deze manier kan je dan namelijk écht OO programmeren en dat zou fantastisch zijn.[/quote:e146b75fba]Zoals je al gelezen heb gaat er heel wat veranderen in PHP 5 op het gebeid van OOP, maar dat wil niet zeggen dat je er nu niet écht OOP kan in PHP, het vergt alleen wat meer disipline, dus waarom wachten op PHP5 als het al in PHP4 goed kan???

    Met disipline bedoel ik bv. eigenschappen niet direct benaderen, en die fout kan alleen gemaakt worden door degene die de class maakt en niet door diegene die de class gebruikt (maar, ben ik met je eens, als dit dezelfde persoon is dan kan de fout er wel snel insluipen, maar niet doen dus).

    In jouw geval zou het geen probleem hoeven zijn als je de methodes anders(=beter in dit geval) opgebouwd zou hebben, zoals cim al opmerkte. Immers wat heeft de methode setLengte() of setBreedte() met oppervlakte te maken?

    [quote:e146b75fba="BasHamar"]En een gerelateerde vraag: kent PHP het principe van constructors en kan je voor dezelfde klasse meerdere construcors maken, uiteraard met een verschillend aantal variabelen, zoals dat ook in Java kan? Of is dit iets te veel van het goede?[/quote:e146b75fba]Ja, maar niet meedere constructors (zie Bill Gates zijn antwoord), maar ik zie de noodzaak van meedere constructors ook niet echt in (ik heb het tot nu nog niet nodig gehad).

    In jou geval zou ik de class dus als onderstaand opbouwen, vanuit gaande dat je alleen de opervlakte met de class zou willen berekenen. (Wil je ook nog andere dingen doen, dan kan de class kompleet veranderen.)

    class:
    [code:1:e146b75fba]class Oppervlakte {

    var $lengte;
    var $breedte;

    function Oppervlakte($lengte = 1, $breedte = 1) {
    $this->lengte = $lengte;
    $this->breedte = $breedte;
    }

    function setLengte($lengte) {
    $this->lengte = $lengte;
    }

    function setBreedte($breedte){
    $this->breedte = $breedte;
    }

    function getOppervlakte() {
    return $this->lengte * $this->breedte;
    }

    }[/code:1:e146b75fba]

    gebruik van class:
    [code:1:e146b75fba]$opp = new Oppervlakte(3,5);
    echo $opp->getOppervlakte(); //geeft 15
    $opp->setLengte(3);
    $opp->setBreedte(2);
    echo $opp->getOppervlakte(); //geeft 6[/code:1:e146b75fba]
  • [quote:573e7b65b6="Remytje"]Eindelijk eens een vraag over OOP 8) (Hopelijk volgen er meer :wink: )[/quote:573e7b65b6]Jaja, met de tijd worden we wijzer… :D

    Er gaan ook hoogstwaarschijnlijk meer vragen volgen, aangezien ik vastbesloten ben vanaf nu alleen nog maar OO te programmeren. Ik heb er nu al spijt van dat ik op mijn huidige site niet de tijd en moeite heb genomen dit te doen, dus dat staat op de planning. Ik heb ook oa ideeën voor een PHP statistieken progje à la Nedstat, maar dan natuurlijk véél beter… :roll:

    Plannen genoeg, dus maak je borst maar nat. ;)

    - Bas
  • [quote:9dcd0b9f36]Met disipline bedoel ik bv. eigenschappen niet direct benaderen, en die fout kan alleen gemaakt worden door degene die de class maakt en niet door diegene die de class gebruikt (maar, ben ik met je eens, als dit dezelfde persoon is dan kan de fout er wel snel insluipen, maar niet doen dus).[/quote:9dcd0b9f36]Ik denk juist: door het ontbreken van private etc kan juist diegene die de class gebruikt "fouten" gaan maken tijdens het gebruik. Diegene die het immers gemaakt heeft weet percies hoe het werkt enzo, diegene die het gebruikt klooit maar wat aan en als het werkt is hij/zij tevreden.

    [quote:9dcd0b9f36]Er gaan ook hoogstwaarschijnlijk meer vragen volgen, aangezien ik vastbesloten ben vanaf nu alleen nog maar OO te programmeren.[/quote:9dcd0b9f36]Gebruik dan geen PHP ;)
    Je kan daar ten eerste geen echte OO mee "produceren" en ten tweede kan je er niet mee programmeren…
  • [quote:24c955cbe0="Bill Gates"]Ik denk juist: door het ontbreken van private etc kan juist diegene die de class gebruikt "fouten" gaan maken tijdens het gebruik. Diegene die het immers gemaakt heeft weet percies hoe het werkt enzo, diegene die het gebruikt klooit maar wat aan en als het werkt is hij/zij tevreden.[/quote:24c955cbe0]Ik denk juist dat het tegenovergesteld is, dat juist diegene die de class gemaakt heeft, de verleiding heeft eigenschappen direct te gebruiken (en komt hier dus de zelfdisipline in oogshow).

    Een ander die de class wil gebruiken is niet geintresseerd in hoe de class werkt (tenzij diegene er van wil leren of aanpassen), maar pakt de handleiding om te kijken hoe hij/zij het object kan 'aansturen' en kan gebruiken dmv de methoden. Denk b.v. aan PEAR, ADOdb, Smarty, etc.

    Maar dit wil niet zeggen dat ik niet blij ben als private en protected worden geïntroduceerd in PHP5, want dan zijn we van dat geklooi af :wink:

    -Rémy
  • [quote:3ae99ca253="BasHamar"]Nu wachten tot PHP5 uitkomt en door mijn host op de server wordt geïnstalleerd… Kan haast niet wachten!

    :D

    - Bas[/quote:3ae99ca253]

    Woei eindelijk php 5!
    Had nog niet eens gezien dat dat er in zou komen :)

    Gelukkig ben ik zelf m'n eigen host, dus als ie uitkomt wordt ie er zo snel mogelijk opgezet :D
    (Eerst ff testen, niet direct helemaal live natuurlijk ;) )
  • [quote:cec874a338="InZane"]Woei eindelijk php 5!
    Had nog niet eens gezien dat dat er in zou komen :)[/quote:cec874a338]Je kan al iets van een jaar de nieuwe engine downloaden ;)

    Zie: http://www.zend.com/store/products/zend-engine.php
  • [quote:2ee75297eb="Bill Gates"][quote:2ee75297eb="InZane"]Woei eindelijk php 5!
    Had nog niet eens gezien dat dat er in zou komen :)[/quote:2ee75297eb]Je kan al iets van een jaar de nieuwe engine downloaden ;)

    Zie: http://www.zend.com/store/products/zend-engine.php[/quote:2ee75297eb]

    Nou ik zie daar gewoon PHP 4 hoor..
  • [quote:aad8d482e2="InZane"]Nou ik zie daar gewoon PHP 4 hoor..[/quote:aad8d482e2]De core van PHP wordt door Zend gemaakt: vervang de engine door een nieuwe en je hebt een soort van nieuwe PHP. En laat die alpha versie die je kan downloaden nu net de nieuwe core van PHP 5 worden…
  • Ik zie óók alleen 4.3.x daar staan… :wink:

    Zie http://snaps.php.net/ voor de laatste development-versies (óók 5.0)…
  • Mja ik maar ik ga natuurlijk geen development versie op een live server draaien ;)
  • [quote:077944493f="InZane"]Mja ik maar ik ga natuurlijk geen development versie op een live server draaien ;)[/quote:077944493f]Watje ;)

    Maar je kan al wel een beetje rommelen natuurlijk thuis…
  • [quote:a58b39f57c="Bill Gates"]Maar je kan al wel een beetje rommelen natuurlijk thuis…[/quote:a58b39f57c]
    Idd, Ik draai nu php 5.0.0-dev (de build van gisteravond ;)) op een oude computer. Tot nu toe draait het heel stabiel (ondanks windows 95 :) ) en de installatie was een 'fluitje van een cent'.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.