Oprettet tor. d. 11. marts 2010 kl. 09:25:21

RippieUK
RippieUK (4.005 point. Point ude: 30)

PHP OOP har jeg forstået det korrekt ??

Hej,

Skal lige høre nogle af jer PHP guru'er derude om PHP OOP og om jeg har forstået det rigtigt.

Hvis vi har flg filer class.lib.php og side1.php har jeg forstået det rigtigt at du bygger din classes og methods i class.lib.php og på side1.php kalder jeg så den class og de methods jeg vil have vist på den side ?

side1.php:
$myObject = new myObject();

$myObject->createHeader();
$myObject->createContent();
$myObject->createFooter();

class.lib.php:

class myObject {
  function createHeader() {
  something
  }

  function createContent() {
  something
  }

  function createFooter() {
  something
  }

}

Er det omkring rigtigt ?

Skrevet tor. d. 11. marts 2010 kl. 09:32:31| #1


Skrevet tor. d. 11. marts 2010 kl. 09:58:28| #2

drlotto
drlotto (10.770 point)
Hvis jeg var dig, og lige startet på OOP, så ville jeg os tage et kig på MVC Framework, det kan gøre din dagligdag meget meget nemmere :)

lidt info:
http://en.wikipedia.org/ (...)

Skrevet tor. d. 11. marts 2010 kl. 10:01:35| #3

#2
Det var en voldsom anbefaling til en som lige er startet på OOP?
At kunne anvende et MVC forudsætter vel at man kan forstå det grundlæggende i OOP hvad angår nedarvning og polymorfi?

Skrevet tor. d. 11. marts 2010 kl. 11:21:57| #4

RippieUK
RippieUK (4.005 point)
Ville jeg have HTML code i min class.lib.php fil ? ikke HTML, HEAD og BODY tags... men DIV's og TABEL's etc ? så jeg ender op med have alt min kode i den class fil `? og så have HTML HEAD BODY i min side1.php ?

Skrevet tor. d. 11. marts 2010 kl. 11:30:00| #5

Det ville være tåbeligt; det er ikke noget der afspejler hvad OOP er til - men ja, du kan sagtens.

Ved at gøre det på den måde, vil du egentlig bare komme ud på et plan hvor du bliver ved med at lave flere og flere metoder i din klasse, for at få mere og mere HTML output der lige passer specielt til den og den lejlighed. Så kunne du lige så godt bare have det i almindelige funktioner - altså, du får ikke noget ud af at have det i en klasse. Klassen er bare en indkapsling af dine funktioner, så.

Skrevet tor. d. 11. marts 2010 kl. 12:43:31| #6

RippieUK
RippieUK (4.005 point)
Så hvis jeg forstår dig korrekt.

side1.php vil indholde din HTML code og når du skal bruge noget data kan du gøre det inde i class.lib.php og så bruge det på side1.php ?

Vil du have noget imod at have en OOP snak en af dagene ? eller vil helst have vi snakker her ?

Skrevet tor. d. 11. marts 2010 kl. 13:18:45| #7

Mjaeh, det er en lidt løs beskrivelse du selv laver - lidt uddybelse havde været rart.

Udgangspunktet bør være at side1.php er ansvarlig for output; det være sig HTML, tekst og så videre.

class.lib.php bør indeholde/behandle data som du vil anvende i på side1.php. Klassens metoder bør ikke udskrive indhold, men blot returnere data (strenge, tal, bools) som side1.php kan behandle.

side1.php
<?php
  include("inc/config.php");
  include("obj/class.lib.php");

  $myObject = new myObject();

  $articles = $myObject->getTopArticles(5);

?>
<!DOCTYPE...>
<html>
  <head>
  <title>...
  </head>
  <body>

    <div class="newsBox">
      <?php foreach($articles as $article): ?>
        <h3><?php $article["headline"]; ?></h3>
        <p>
          <?php echo $article["teaser"]; ?>
          <br />
          <a href="articles.php?articleId=<?php echo $article["articleId"]; ?>" class="readMore">Læs mere</a>
        </p>
      <?php endforeach; ?>
    </div>
    ...
  </body>
</html>


Alternativt kan du pakke den generiske HTML kode ind i nogle andre filer og inkludere dem istedet.

side1.php (generisk)
<?php
  include("inc/config.php");
  include("obj/class.lib.php");

  $myObject = new myObject();

  $articles = $myObject->getTopArticles(5);

?>
<?php include("inc/html_start.php");

    <div class="newsBox">
      <?php foreach($articles as $article): ?>
        <h3><?php $article["headline"]; ?></h3>
        <p>
          <?php echo $article["teaser"]; ?>
          <br />
          <a href="articles.php?articleId=<?php echo $article["articleId"]; ?>" class="readMore">Læs mere</a>
        </p>
      <?php endforeach; ?>
    </div>
    ...
<?php include("inc/html_end.php"); ?>


og class.lib.php
<?php

  class myObject
  {
    private $db;

    public function __construct()
    {
      // instans af et databaseabstraktionslag
      // ikke vigtigt lige nu, bare for at indikere at jeg
      // åbner en forbindelse til databasen
      $this->db = factory::instance("Database.Mysqli");
    }

    public function getTopArticles( $limit = 3 )
    {
      $sql = "SELECT articleId, headline, teaser FROM articles ORDER BY date DESC LIMIT ".$limit;
      $this->db->query($sql);
      return $this->db->result2array();
    }
   
    ...
  }

?>


For trådens og forummets skyld, finder jeg det mere passende hvis snakken fortsætter her.

Skrevet tor. d. 11. marts 2010 kl. 23:04:40| #8

RippieUK
RippieUK (4.005 point)
Kan godt se at jeg bruger OOP helt forkert så. tror jeg vil læse mere op på det og indtil videre bare lave procedural php indtil jeg kan nok OOP.. Kan se det er vejen frem og jeg vil ivrigt læse op på det :)

Du har været super til at hjælpe !!

Jeg vil lige tænke lidt over det her i nat og imorgen og skrive noget mere derefter :)

Skrevet ons. d. 17. marts 2010 kl. 00:32:44| #9

RippieUK
RippieUK (4.005 point)
Hej igen.

Sidder lige og kigger på lidt OOP, og øver mig lige med en menu, og skal lige høre kan jeg ikke i min class.lib.php have en method der kalder en SQL og så i min page.php have while($row = mysql_fetch_array($query)) { ? Eller bliver jeg nødt til at smide det ind i en array ?

Skrevet ons. d. 17. marts 2010 kl. 09:01:37| #10

Jo, det er der for så vidt ingenting i vejen for - men...

Forestil dig at du har det setup som du selv beskriver.

class.lib.php
<?php

  class myObject
  {
    public function myMethod()
    {
      $sql = "SELECT * FROM pages";
      $res = mysql_query($sql);
      return $res;
    }
  }

?>


page.php
<?php

  $myObject = new myObject();
  $pages = $myObject->myMethod();

  while( $row = mysql_fetch_array($pages) )
  {
    // ...
  }

?>


I tilfælde af at jeg hellere ville arbejde med en anden database (PostgreSQL eksempelvis) ville jeg nu have to filer jeg skal rette i for at få det til at virke.

Derimod kan jeg faktisk nøjes med at tilpasse en enkelt fil, hvvis jeg klarer alt det database relaterede i samme fil:

class.lib.php
<?php

  class myObject
  {
    public function myMethod()
    {
      $sql = "SELECT * FROM pages";
      $res = mysql_query($sql);
      return $this->result2array($res);

    }

    private function result2array( $mysqlResult )
    {
      $tmpArray = array();
      while( $row = mysql_fetch_array($mysqlResult) )
        $tmpArray[] = $row;

      return $tmpArray;
    }

   

  }

?>


page.php
<?php

  $myObject = new myObject();
  $pages = $myObject->myMethod();

  foreach( $pages as $page )
  {
    // ...
  }

?>


Jeg kan nu hurtigt konvertere min klasse til at kommunikere med en PostgreSQL database i stedet.
class.lib.php
<?php

  class myObject
  {
    public function myMethod()
    {
      $sql = "SELECT * FROM pages";
      $res = pg_query($this->conn, $sql);
      return $this->result2array($res);

    }

    private function result2array( $mysqlResult )
    {
      $tmpArray = array();
      while( $row = pg_fetch_array($mysqlResult) )
        $tmpArray[] = $row;

      return $tmpArray;
    }

   

  }

?>


Simpelt, hurtigt og effektivt

Skrevet ons. d. 17. marts 2010 kl. 09:20:02| #11

RippieUK
RippieUK (4.005 point)
Tusinde tak... må jeg lige høre dig om 2 ting.

1. jeg går ud fra på din page.php do connecter op til MYSQL som normalt ? og kan bruge den connection i din class.lib.php ?

jeg læser fint din kode, men undre mig hvordan du får $mysqlResult fra ?

Skrevet ons. d. 17. marts 2010 kl. 09:37:03| #12

Som jeg viste dig i #7, så har jeg et databaseabstraktionslag tilnkyttet.
I dit tilfælde ville det dog nok være lige voldsomt nok at begynde på, når du ikke har mere styr på OOP end du har, så fremgangsmåden må være lidt mere simpel:

page.php
<?php
  include("inc/config.inc.php"); // Indeholder bl.a. MySQL forbindelsesoplysninger
  include("lib/class.lib.php");

  $myObject = new myObject();
  $pages = $myObject->myMethod();

?>
<html>
  <head>
  ... præcis som vi gjorde før.
  </body>
</html><


class.lib.php
<?php

  class myObject
  {
    private $db;

    public function __construct()
    {
      // Anvender her konstanter defineret i config.inc.php
      $this->db = mysql_connect(DB_HOST, DB_USER, DB_PASS);
      mysql_select_db(DB_BASE, $this->db);
    }

    public function myMethod()
    {
      $sql = "SELECT * FROM pages";
      $res = mysql_query($sql, $this->db);
      return $this->result2array($res);

    }

    private function result2array( $mysqlResult )
    {
      $tmpArray = array();
      while( $row = mysql_fetch_array($mysqlResult) )
        $tmpArray[] = $row;

      return $tmpArray;
    }

   

  }

?>


$mysqlResult er jo bare en variabel jeg har navngivet ud fra den første parameter i min funktion? En funktions parametre kan du jo navngive som du vil?

Skrevet ons. d. 17. marts 2010 kl. 17:22:15| #13

RippieUK
RippieUK (4.005 point)
Hvad gør jeg forkert her:

class.lib.php:
class skillMatrix {

    public function createNavi() {
        $links = array(
        'Home' => 'index.php',
        'About' => 'about_us.php',
        'Contact' => 'contact.php'
        );
    }

}

index.php:
require_once 'includes/class.lib.php';    // contain my object methods
$skillMatrix = new skillMatrix();
$skillMatrix->createNavi();

  foreach ($links as $key => $value) {
  echo "<a href=\"$value\">$key</a>";
    }

It gives this error:
Warning: Invalid argument supplied for foreach() in /customers/rippie.dk/rippie.dk/httpd.www/new/skillsmatrix/index.php on line 44

Line 44 on index.php is:
foreach ($links as $key => $value) {

Any ideas ?

Ronnie

Skrevet ons. d. 17. marts 2010 kl. 22:26:47| #14

roxki
roxki (18.114 point)
$links fra funktionen createNavi() kan KUN tilgås inde i klassen og derfor kan din foreach($links ...) ikke finde ud hovede og hale i hvad det er du vil have den til.

Du kan vælge at returnerer $links fra funktionen og på den måde gemme $links i en variabel uden for klassen på følgende måde: $links = $skillMatrix->createNavi();

Skrevet ons. d. 17. marts 2010 kl. 22:27:26| #15

roxki
roxki (18.114 point)
Rettelse til mig selv: $links fra funkionen createNavi() kan KUN tilgås fra funktionen createNavi() og ikke fra hele klassen skillMatrix

Skrevet tor. d. 18. marts 2010 kl. 06:32:56| #16

RippieUK
RippieUK (4.005 point)
Ja det kan jeg godt se. Det jeg ville prøve var ikke at have mine links til min menu inde i en mysql, men i stedet smide dem ind i en array inde i class.lib.php og bruge den function/method fra de andre sider.

Kan i hjælpe mig med en løsning ?

Skrevet tor. d. 18. marts 2010 kl. 14:06:44| #17

roxki
roxki (18.114 point)
Som sagt kan du vælge at returnerer dit $links-array fra createNavi() sådan her:

class skillMatrix {

    public function createNavi() {
        $links = array(
        'Home' => 'index.php',
        'About' => 'about_us.php',
        'Contact' => 'contact.php'
        );
        return $links;
    }

}

Nu kan du så angive en variable til skillMatrix::createNavi() sådan her:
$skillMatrix = new skillMatrix();
$links = $skillMatrix->createNavi();


og så burde din foreach-loop virke.

Skrevet tor. d. 18. marts 2010 kl. 16:51:11| #18

RippieUK
RippieUK (4.005 point)
Virker jo perfekt !!!! Tusinde tusinde tak.

Kan i begge smide et svar så jeg kan give jer begge point?

Vil meget gerne høre jer om en ting mere, hvis i vil have et nyt spørgsmål oprettet er det ok. I roxki sidste example, er der en måde hvor jeg HIGHLIGHT det menu punkt jeg sidst har klikket på ? så mine brugere ved hvor de er?

Skrevet tor. d. 18. marts 2010 kl. 18:54:49| #19

roxki
roxki (18.114 point)
Var så lidt :-)

Ang. dit spørgsmål om highlight af den side man er på, kan det godt ordnes, men det er noget du skal gøre i dit foreach-loop alt efter hvilken side man er på, som du kan finde via $_SERVER["SCRIPT_NAME"]

Skrevet tor. d. 18. marts 2010 kl. 18:54:58| #20

roxki
roxki (18.114 point)
og her får du et svar.

Skrevet fre. d. 19. marts 2010 kl. 10:04:35| #21


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

php problem få en kode fra en anden side

Oprettet den 11. februar 2012 kl. 23.53
jesperkaae95 giver 30 point for svar | Giv et svar »

Udtræk af enkelte felter fra bestemte kolonner i mysql

Oprettet den 11. februar 2012 kl. 19.27
hrole giver 30 point for svar | Giv et svar »

Procentregning

Oprettet den 11. februar 2012 kl. 11.26
sevinding giver 60 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger