Vra

Wat is beter om te gebruik in PHP, 'n 2D-skikking of'n klas?Ek het ingesluit'n voorbeeld van wat ek bedoel met dit.

// Using a class
class someClass
{
    public  $name;
    public  $height;
    public  $weight;

    function __construct($name, $height, $weight)
    {
        $this -> name       = $name;
        $this -> height = $height;
        $this -> weight = $weight;
    }
}

$classArray[1] = new someClass('Bob', 10, 20);
$classArray[2] = new someClass('Fred', 15, 10);
$classArray[3] = new someClass('Ned', 25, 30);


// Using a 2D array
$normalArray[1]['name'] = 'Bob';
$normalArray[1]['height']   = 10;
$normalArray[1]['weight']   = 20;

$normalArray[2]['name'] = 'Fred';
$normalArray[2]['height']   = 15;
$normalArray[2]['weight']   = 10;

$normalArray[3]['name'] = 'Ned';
$normalArray[3]['height']   = 25;
$normalArray[3]['weight']   = 30;

Die veronderstelling dat iemand nie uit te kom en wys dat die klasse is te stadig, dit lyk soos klas wen.

Ek het nie idee wat antwoord ek moet aanvaar om te ek het net upvoted almal van hulle.


En ek het nou geskryf twee naby identies bladsye, een met behulp van die 2D-skikking (geskryf voor hierdie vraag is geplaas) en nou een met behulp van'n klas en ek moet sê dat die klas produseer baie lekkerder kode.Ek het geen idee hoeveel oorhoofse gaan word gegenereer maar ek twyfel dit sal die teenstander die verbetering van die kode self.

Dankie vir die hulp om my te maak'n beter programmeerder.

Was dit nuttig?

Oplossing

Die "klas" wat jy hierbo het gebou is wat die meeste mense 'n struct sal gebruik in ander tale. Ek is nie seker wat die implikasies prestasie is in PHP, alhoewel ek vermoed dat die instantiëren die voorwerpe is waarskynlik duurder hier, al is dit net deur 'n bietjie.

Dit gesê, as die koste is relatief laag is, is dit 'n bietjie makliker om die voorwerpe te bestuur, in my opinie.

Ek is net sê die volgende gebaseer op die titel en jou vraag, maar: Hou in gedagte dat klasse bied die voordeel van metodes en toegangsbeheer, sowel. So as jy wil om seker te maak dat mense nie die verandering van gewigte aan negatiewe getalle, kan jy die veld weight private maak en 'n mate van accessor metodes, soos getWeight() en setWeight(). Binne setWeight(), kan jy 'n bietjie waarde nagaan doen, soos so:

public function setWeight($weight)
{
    if($weight >= 0)
    {
        $this->weight = $weight;
    }
    else
    {
        // Handle this scenario however you like
    }
}

Ander wenke

Dit hang presies wat jy bedoel met "beter". Ek sal gaan vir die objekgeoriënteerde wyse (met behulp van klasse), want ek vind dit maak vir skoner kode (ten minste in my mening). Maar ek is nie seker wat die spoed boetes kan wees vir daardie opsie.

In die algemeen, volg ek hierdie reël:

1) Maak dit 'n klas as verskeie dele van jou aansoek gebruik die data struktuur.

2) Maak dit 'n 2D-skikking as jy dit met behulp van vir 'n vinnige verwerking van data in 'n deel van jou aansoek.

Dit is die spoed wat ek dink van meestal, vir iets meer kompleks as wat ek hier sou ek waarskynlik gaan met klasse, maar die vraag is, wat is die koste van'n klas?

Dit sou blyk te wees voortydige optimalisering.Jou aansoek is nie van plan om enige werklike wêreld prestasie getref óf manier, maar met behulp van'n klas kan jy gebruik getter en setter metodes en is oor die algemeen gaan om beter te wees vir die kode inkapseling kode en hergebruik.

Met die skikkings jy aangaan koste in moeiliker om te lees en te handhaaf kode, jy kan nie eenheid toets die kode so maklik en met'n goeie klas struktuur ander ontwikkelaars moet vind dit makliker om te verstaan as wat hulle nodig het om dit te neem op.

En toe later op jy nodig het om te voeg ander metodes te manipuleer hierdie, jy sal nie'n argitektuur uit te brei.

Die klas wat jy is nie 'n werklike klas in OO terme -. Sy pas contructed om die ruimte van die geval veranderlikes te neem

Dit gesê - daar waarskynlik aan die feit isnt veel saak met spoed -. Dit is net 'n styl ding in jou voorbeeld

Die intres ting bietjie - is as jy die voorwerp aan 'n ware "persoon" klas wees contsrtucted - en thinkng oor die ander attribute en aksies wat jy kan van die persoon klas - dan sou jy nie net 'n styl vertoning sien - skrif kode - maar ook spoed prestasie

.

As jou kode gebruik baie funksies wat werk op daardie kenmerke (naam / hoogte / gewig), dan met behulp van die klas kan 'n goeie opsie wees.

Teifion, as jy gebruik klasse as'n blote plaasvervanger vir skikkings, jy is nêrens naby OOP.Die essensie van OOP is dat voorwerpe kennis en verantwoordelikheid, eintlik kan dinge doen en saam te werk met ander klasse.Jou voorwerpe kennis en kan dit nie doen enigiets anders as ledig bestaan nie, maar dit lyk asof hulle'n goeie kandidate vir volharding verskaffers (voorwerpe wat weet hoe om te stoor/te herwin hulself in/uit die databasis).

Moenie bekommerd wees oor die prestasie, ook.Voorwerpe in PHP is'n vinnige en liggewig en prestasie in die algemeen is baie oorskat.Dit is goedkoper om te slaan jou tyd as'n programmeerder met behulp van die regte benadering as te red mikrosekondes in jou program met'n paar obskure, moeilik om te ontfout en op te los stuk van die kode.

Die meeste toetse daardie tyd skikkings vs klasse net toets hulle instancing. Sodra jy eintlik begin om iets te doen met hulle.

Ek was 'n "puristiese" wat net skikkings gebruik omdat die prestasie was soveel beter. Ek het die volgende kode te regverdig om myself aan die ekstra moeite van nie met behulp van klasse (selfs al is dit makliker op die programmeerder)

regverdig

Kom ons sê maar ek was baie verbaas oor die resultate!

    <?php
$rx = "";
$rt = "";
$rf = "";

$ta = 0; // total array time
$tc = 0; // total class time

// flip these to test different attributes
$test_globals = true;
$test_functions = true;
$test_assignments = true;
$test_reads = true;


// define class


class TestObject
{
  public $a;
  public $b;
  public $c;
  public $d;
  public $e;
  public $f;

  public function __construct($a,$b,$c,$d,$e,$f)
  {
    $this->a = $a;
    $this->b = $b;
    $this->c = $c;
    $this->d = $d;
    $this->e = $e;
    $this->f = $f;
  }

  public function setAtoB()
  {
      $this->a = $this->b;
  }
}

// begin test

echo "<br>test reads: " . $test_reads;
echo "<br>test assignments: " . $test_assignments;
echo "<br>test globals: " . $test_globals;
echo "<br>test functions: " . $test_functions;
echo "<br>";

for ($z=0;$z<10;$z++)
{
    $starta = microtime(true);

    for ($x=0;$x<100000;$x++)
    {
        $xr = getArray('aaa','bbb','ccccccccc','ddddddddd','eeeeeeee','fffffffffff');

        if ($test_assignments)
        {
            $xr['e'] = "e";
            $xr['c'] = "sea biscut";
        }

        if ($test_reads)
        {
            $rt = $x['b'];
            $rx  = $x['f'];
        }

        if ($test_functions) { setArrAtoB($xr); }
        if ($test_globals) { $rf = glb_arr(); }
    }
    $ta = $ta + (microtime(true)-$starta);
    echo "<br/>Array time = " . (microtime(true)-$starta) . "\n\n";


    $startc = microtime(true);

    for ($x=0;$x<100000;$x++)
    {
        $xo = new TestObject('aaa','bbb','ccccccccc','ddddddddd','eeeeeeee','fffffffffff');

        if ($test_assignments)
        {
            $xo->e = "e";
            $xo->c = "sea biscut";
        }

        if ($test_reads)
        {
            $rt = $xo->b;
            $rx = $xo->f;
        }

        if ($test_functions) { $xo->setAtoB(); }
        if ($test_globals) { $xf = glb_cls(); }
    }

    $tc = $tc + (microtime(true)-$startc);
    echo "<br>Class time = " . (microtime(true)-$startc) . "\n\n";

    echo "<br>";
    echo "<br>Total Array time (so far) = " . $ta . "(100,000 iterations) \n\n";
    echo "<br>Total Class time (so far) = " . $tc . "(100,000 iterations) \n\n";
    echo "<br>";

}
echo "TOTAL TIMES:";
echo "<br>";
echo "<br>Total Array time = " . $ta . "(1,000,000 iterations) \n\n";
echo "<br>Total Class time = " . $tc . "(1,000,000 iterations)\n\n";


// test functions

function getArray($a,$b,$c,$d,$e,$f)
{
    $arr = array();
    $arr['a'] = $a;
    $arr['b'] = $b;
    $arr['c'] = $c;
    $arr['d'] = $d;
    $arr['d'] = $e;
    $arr['d'] = $f;
    return($arr);
}

//-------------------------------------

function setArrAtoB($r)
{
    $r['a'] = $r['b'];
}

//-------------------------------------

function glb_cls()
{
    global $xo;

    $xo->d = "ddxxdd";
    return ($xo->f);
}

//-------------------------------------

function glb_arr()
{
    global $xr;

    $xr['d'] = "ddxxdd";
    return ($xr['f']);
}

//-------------------------------------

?>

toets lui: 1 toets opdragte: 1 toets globals: 1 toets funksies: 1

Array tyd = 1,58905816078 Klastyd = 1,11980104446 Totale Array tyd (tot dusver) = 1,58903813362 (100000 iterasies) Totale Klastyd (tot dusver) = 1,11979603767 (100000 iterasies)

Array tyd = 1,02581000328 Klastyd = 1,22492313385 Totale Array tyd (tot dusver) = 2,61484408379 (100000 iterasies) Totale Klastyd (tot dusver) = 2,34471416473 (100000 iterasies)

Array tyd = 1,29942297935 Klastyd = 1,18844485283 Totale Array tyd (tot dusver) = 3,91425895691 (100000 iterasies) Totale Klastyd (tot dusver) = 3,5331492424 (100000 iterasies)

Array tyd = 1,28776097298 Klastyd = 1,02383089066 Totale Array tyd (tot dusver) = 5,2020149231 (100000 iterasies) Totale Klastyd (tot dusver) = 4,55697512627 (100000 iterasies)

Array tyd = 1,31235599518 Klastyd = 1,38880181313 Totale Array tyd (tot dusver) = 6,51436591148 (100000 iterasies) Totale Klastyd (tot dusver) = 5,94577097893 (100000 iterasies)

Array tyd = 1,3007349968 Klastyd = 1,07644081116 Totale Array tyd (tot dusver) = 7,81509685516 (100000 iterasies) Totale Klastyd (tot dusver) = 7,02220678329 (100000 iterasies)

Array tyd = 1,12752890587 Klastyd = 1,07106018066 Totale Array tyd (tot dusver) = 8,94262075424 (100000 iterasies) Totale Klastyd (tot dusver) = 8,09326195717 (100000 iterasies)

Array tyd = 1,08890199661 Klastyd = 1,09139609337 Totale Array tyd (tot dusver) = 10,0315177441 (100000 iterasies) Totale Klastyd (tot dusver) = 9,18465089798 (100000 iterasies)

Array tyd = 1,6172170639 Klastyd = 1,14714384079 Totale Array tyd (tot dusver) = 11,6487307549 (100000 iterasies) Totale Klastyd (tot dusver) = 10,3317887783 (100000 iterasies)

Array tyd = 1,53738498688 Klastyd = 1,28127002716 Totale Array tyd (tot dusver) = 13,1861097813 (100000 iterasies) Totale Klastyd (tot dusver) = 11,6130547523 (100000 iterasies)

Totaal: Totale Array tyd = 13,1861097813 (1000000 iterasies) Totale Klastyd = 11,6130547523 (1000000 iterasies)

So, óf manier die verskil is redelik gering. Ek is baie suprized om uit te vind dat sodra jy begin om toegang tot dinge wêreldwyd, klasse eintlik 'n bietjie vinniger geword.

Maar moet my nie vertrou nie, loop dit vir jou self. Ek persoonlik voel nou heeltemal skuld vry oor die gebruik van klasse in my hoë werkverrigting programme. : D

@Richard Varno

Ek het jou presiese kode (na vaste die klein foute), en het baie verskillende resultate as jy. Klasse het baie op my PHP 5.3.17 installeer.

Array tyd = ,69054913520813 Klastyd = 1,1762700080872

Totaal Array tyd (tot dusver) = ,69054508209229 (100000 iterasies) Totale Klastyd (tot dusver) = 1,1762590408325 (100000 iterasies)

Array tyd = ,99001502990723 Klastyd = 1,22034907341

Totaal Array tyd (tot dusver) = 1,6805560588837 (100000 iterasies) Totale Klastyd (tot dusver) = 2,3966031074524 (100000 iterasies)

Array tyd = ,99191808700562 Klastyd = 1,2245700359344

Totaal Array tyd (tot dusver) = 2,6724660396576 (100000 iterasies) Totale Klastyd (tot dusver) = 3,6211669445038 (100000 iterasies)

Array tyd = ,9890251159668 Klastyd = 1,2246470451355

Totaal Array tyd (tot dusver) = 3,661484003067 (100000 iterasies) Totale Klastyd (tot dusver) = 4,8458080291748 (100000 iterasies)

Array tyd = ,99573588371277 Klastyd = 1,1242771148682

Totaal Array tyd (tot dusver) = 4,6572148799896 (100000 iterasies) Totale Klastyd (tot dusver) = 5,9700801372528 (100000 iterasies)

Array tyd = ,88518786430359 Klastyd = 1,1427340507507

Totaal Array tyd (tot dusver) = 5,5423986911774 (100000 iterasies) Totale Klastyd (tot dusver) = 7,1128082275391 (100000 iterasies)

Array tyd = ,87605404853821 Klastyd = ,95899105072021

Totaal Array tyd (tot dusver) = 6,4184486865997 (100000 iterasies) Totale Klastyd (tot dusver) = 8,0717933177948 (100000 iterasies)

Array tyd = ,73414516448975 Klastyd = 1,0223190784454

Totaal Array tyd (tot dusver) = 7,1525888442993 (100000 iterasies) Totale Klastyd (tot dusver) = 9,0941033363342 (100000 iterasies)

Array tyd = ,95230412483215 Klastyd = 1,059828042984

Totaal Array tyd (tot dusver) = 8,1048839092255 (100000 iterasies) Totale Klastyd (tot dusver) = 10,153927326202 (100000 iterasies)

Array tyd = ,75814390182495 Klastyd = ,84455919265747

Totaal Array tyd (tot dusver) = 8,8630249500275 (100000 iterasies) Totale Klastyd (tot dusver) = 10,998482465744 (100000 iterasies) Totaal:

Totaal Array tyd = 8,8630249500275 (1000000 iterasies) Totale Klastyd = 10,998482465744 (1000000 iterasies)

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top