OOP in PHP, nuttig?

Status
Niet open voor verdere reacties.

martijn12321

Gebruiker
Lid geworden
14 nov 2011
Berichten
827
Hallo,

Ik vroeg me af wat het voordeel is van OOP/classes in PHP. Sommige mensen zijn heel positief maar kunnen vaak niet uitleggen waarom, anderen zeggen dat het niet echt voors of tegens heeft, andere zeggen dat het zelfs slecht/traag is.

Wat is nou de waarheid? En als het juist slecht of neutraal is, waarom hebben ze het dan in PHP gestopt, en is niet iedereen bij normale functies gebleven in PHP?

Bedankt! :thumb:
 
OOP is een techniek met een aantal voordelen. Het zijn echter voordelen voor mensen, niet per se het programma. In zo'n beetje elke taal kun je procedureel of object oriented programmeren.

Het grote voordeel van OOP is dat duplicatie en scheiding van code duidelijker is voor zowel de schrijver als de compiler en de IDE. Bij PHP wordt (/kan) dat deels tenietgedaan door het feit dat "strong typing" niet vereist is. Wat wel blijft bestaan is het feit dat je objecten makkelijker kunt delen en hergebruiken.

Er zijn dus algemene argumenten voor OOP en specifiek voor PHP. Het is dus niet vreemd dat je veel verschillende verhalen vind.

Algemeen:

Minder fouten in de code (aware IDE gecombineerd met strong typing)
Makkelijker hergebruik van code (klasse kan gebruikt worden zonder diepe kennis)
Makkelijker debuggen (de scheidingen van mogelijke oorzaken en analyse is vaak makkelijker in OOP)
Makkelijker samenwerken aan code (zie ook hergebruik)

Ik heb zelf jaren functioneel geprogrammeerd voordat OOP gangbaar werd. Ik heb de overgang zelf langzaam gemaakt, maar als je eenmaal het concept doorhebt is OOP vaak uiteindelijk handiger.

Specifiek voor PHP is het wat moeilijker. Een aantal voordelen blijven wel bestaan, maar door de minimale handhaving van de taal zelf plus het feit dat het een script taal is, is het hier moeilijker om hier hard wat over te zeggen. Voor grote (publieke) projecten zou ik nog steeds kiezen voor OOP vanwege de "menselijke" voordelen.
 
Wat Wampier zegt; OOP is voor mensen makkelijker te snappen omdat de functionaliteit wordt opgeknipt in kleine,
goed te bevatten brokjes. (zie: single responsibility principle en D.R.Y)

Echter, een techniek is niet goed of slecht, de toepassing van een techniek is goed of slecht.
Het is heel makkelijk om in OOP de blokjes verkeerd in te delen en zo een grote puinhoop te maken.
Een van de standaard fouten die mensen vaak maken is lazy-loading uit een database; ze maken een webshop
met een class voor een product, met daarin een class voor een eigenschap en een class voor een prijs en voor een voorraad en...

Tegen de tijd dat je het hele product geladen hebt ben je zomaar 14 queries verder en als je dan ene lijst van 60k producten moet onderzoeken
dan kun je rustig een kopje koffie gaan halen.

In dit soort gevallen moet je het doorzoeken van 60k producten zien als een aparte responsibility en dus een aparte class en dan wordt het een apartequery
en dan is er geen vuiltje aan de lucht.
 
alles wat hierboven staat ben ik volledig eens nu is er orm en oop
voor orm in php ben ik niet zo voorstander

voor vertaling in oop kan het eens zeer leuk worden met clone

en verder heb ik meestal het probleem met de dbconnectie die dan bij mij globaal op het object komt .
door centraal de database gegevens te willen hebben moet ik dan altijd een refertie meegeven.

een klein voorbeeld van een mogelijke opbouw van mij
PHP:
<?PHP
 /**
 * @author Lieven Roegiers
 * @copyright 2007 refactor 2009
 * @CMS autosite
 * opensource http://code.google.com/p/autosite/
 */
if (!function_exists('csv_plus')){//include_once its when it is include in the php lib
class csv_plus implements tosave{
	private	$Delimiter=',';
	private $maxfilesize=1000;
	private $filelocation;
    private $minlivetime =0;
	private $file;
	private $errornr;
	/** 
	 * @param mixed $pathname
	 * @param mixed $filelocation
	 * @param integer $lifetime
	 * @return
	 */
	public function __construct($pathname,$filelocation,$lifetime = 0){
		$this->filelocation=$pathname.$filelocation;
		$this->minlivetime = $lifetime;//(1 * 1 * 60 * 60);
	}
	/**
	 * @param string $mode
	 * @return
	 */
	private function open($mode='a+'){
		return($this->is_readytouse()&& $this->file = fopen($this->filelocation,$mode)); //File!found E53 
	}
	/**
	 * @param mixed $arrData
	 * @param bool $del_oldlines
	 * @return
	 */
	function save_line($arrData,$del_oldlines=true){
		if ($del_oldlines){
			$this->del_oldlines();
		}
		$timestamp = ($this->minlivetime>0)?(time()+$this->minlivetime).$this->Delimiter:"";
		$datastring =" ".$timestamp.implode($this->Delimiter,$arrData);//space on the front is for search
		$datastring = $this->Aln2br($datastring)."\n";
		return ($this->open()&& fputs($this->file, $datastring));
	}
	/**
	 * @return bool
	 */
    private function Aln2br($txt){
        return strtr($txt, array("\r\n" => '<br/>', "\r" => '<br/>', "\n" => '<br/>'));
    }
    private function Abr2ln($txt){
        return strtr($txt, array("<br />" => "\n", "<br/>" => "\n"));
    }
	public function is_readytouse(){
		return(isset($this->filelocation)&& is_file($this->filelocation));
	}
	/**
	 * @param mixed $source fname
	 * @param string $destprefix
	 * @return bool
	 */
	private function bakup($source,$destprefix=".BAK"){
		return (is_file($source) && (filesize($source)>0)&& !copy($source, $source.$destprefix));
	}
    /**
	 * @return void
	 */
 	private function add($source,$destprefix=".BAK"){
		return (is_file($source) && (filesize($source)>0)&& !copy($source, $source.$destprefix));
	}
    /**
	 * @return void
	 */
	private function del_oldlines(){
		if ($this->is_readytouse()&& filesize($this->filelocation)>$this->maxfilesize){
			if ($this->bakup($this->filelocation)){//rename($path.$file, $path.$bakfile);
				unlink ($this->filelocation);
			}
			$lines = file($this->filelocation.".BAK");
			if (!$this->open()) {
				foreach ($lines as $line_num => $line){
					$kkey=explode(',', $line);
					if((time() > $kkey[0])){//releastijd
					}elseif(fputs($file,$line)){//infileplaatsen
					}else {//echo "error write bakup";
					}
				}		
			}
		}	
	}
	/**
	 * @param mixed $Fname
	 * @return
	 */
	function HTML_listvieuw($Fname){
		$row = 1;
		$fp = fopen ($fname,"r");
		while ($data = fgetcsv($Fname,1000,",")) {
		    $num = count ($data);
		    print "<p> $num velden in regel $row: <br>\n";
		    $row++;
		    for ($c=0; $c < $num; $c++) {
		        print $data[$c] . "<br>\n";
		    }
		}	
	}
	/*function HTML_table($Fname){
		$row = 1;
		$fp = fopen ($fname,"r");
		while ($data = fgetcsv($Fname,1000,",")) {
		    $num = count ($data);
		    print "<p> $num velden in regel $row: <br>\n";
		    $row++;
		    for ($c=0; $c < $num; $c++) {
		        print $data[$c] . "<br>\n";
		    }
		}	
	}*/
	/**
	 * @param mixed $findstring
	 * @param integer $resul
	 * @return string line
	 */
	function find_line($findstring,$resul=1){
		if ($this->open()){
			while (!feof($this->file))
	    		{$line = fgetcsv($this->file,1024,",");
	    			if(is_array ($line)){
						if (!$pos = array_search($findstring,$line )){ 
	     				//print_r($line); //niet gekozen items	
	     				}else{
	     					return  $line ;
	     					exit;	
						}
	     			}else{
						//fun_error(381);//Invalid array
					}
	 		$line=""; 
			}
		}
	}
    	/**
	 * @param mixed $findstring
	 * @param integer $resul
	 * @return string line
	 */
	private function pos_line($findstring,$resul=1){
		if ($this->open()){
			while (!feof($this->file))
	    		{$line = fgetcsv($this->file,1024,",");
	    			if(is_array ($line)){
						if (!$pos = array_search($findstring,$line )){ 
	     				//print_r($line); //niet gekozen items	
	     				}else{
	     					return  $line ;
	     					exit;	
						}
	     			}else{
						//fun_error(381);//Invalid array
					}
	 		$line=""; 
			}
		}
	}
	/**
	 * @return
	 */
	function __destruct(){
		@fclose ($this->file);
	}	 	
}
}
?>
en met een database
PHP:
<?php
class x{
    protected $database;
    private $db_name;
    protected $debug;

    public function __construct($Inc,$debug=false){
        $this->debug=$debug;
        $this->getdatabase(true,$Inc);
    }

    private function getdatabase($reload=false, $Inc){
        if(!isset($this->database)||$reload){
            include( $Inc ."//mysql.php");
            $this->database = $database;
            $this->db_name  = $db_name;

            mysql_select_db($db_name,$this->database);
            return true;
        }else{
            return true;
        }
    }
    public function __destruct() {
        @$this->database->close();
        $this->database=null; 
    }
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan