/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Overskriv $this
Fra : Martin


Dato : 26-11-10 02:57

Hej,

Sidder lige med et lille problem her i nat.

Er egentlig en del af et større system, så jeg har lige skåret det ned
til minimum.

<?php
class Bar extends Foo {
public $iam = 'Bar';
}
class Foo {
public $iam = 'Foo';
public function actAs($class)
{
return new $class;
}
}

$obj = new Bar;
echo $obj->iam; // Bar
// Denne virker som forventet

$obj = new Foo;
$obj->actAs('Bar');
echo $obj->iam; // Foo
// Denne virker så desværre ikke

// Så prøvede jeg
$obj = new Foo;
$new = $obj->actAs('Bar');
echo $new->iam; // Bar

// Den virker, men er sku lidt dumt at skulle assigne en ny variabel

// Så ville jeg prøve

public function actAs($class)
{
$this = new $class;
return $this;
}
// Det må man så ikke "Fatal error, can not overwrite $this"
?>

Så hvordan ville du gøre det? - Uden at skulle assigne som en ny
variabel - Hvis det ellers overhovedet er muligt?

 
 
Bertel Lund Hansen (26-11-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 26-11-10 09:23

Martin skrev:

> <?php
> class Bar extends Foo {
> public $iam = 'Bar';
> }
> class Foo {
> public $iam = 'Foo';
> public function actAs($class)
> {
> return new $class;
> }
> }

> Så hvordan ville du gøre det?

Jeg ville lave mit design anderledes fra grunden af. Det kan kun
føre til forvirring at få en klasse til at opføre sig som en
anden.

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Martin (26-11-2010)
Kommentar
Fra : Martin


Dato : 26-11-10 09:27

On 26-11-2010 09:23, Bertel Lund Hansen wrote:
> Martin skrev:
>
>> <?php
>> class Bar extends Foo {
>> public $iam = 'Bar';
>> }
>> class Foo {
>> public $iam = 'Foo';
>> public function actAs($class)
>> {
>> return new $class;
>> }
>> }
>
>> Så hvordan ville du gøre det?
>
> Jeg ville lave mit design anderledes fra grunden af. Det kan kun
> føre til forvirring at få en klasse til at opføre sig som en
> anden.

Ikke når man ser det i helheden.
Forstil dig at hver række type i databasen har sin egen klasse, men man
godt vil have fx. et datetime felt til at kunne opføre sig som et date
felt, så man ikke skal vælge tid, men kun dato.

Desuden med klasser er det også modul baseret så det er nemt at udvide
med sine egne typer.

Kig fx på Zend_Form hvor hvert input type har sin egen klasse, men nogle
gange så vil man jo gerne have et tekstfelt til at være et datofelt fx.
- Hvis det er databasen der styrer hvilken input type den skal have

Bertel Lund Hansen (26-11-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 26-11-10 11:34

Martin skrev:

> Forstil dig at hver række type i databasen har sin egen klasse, men man
> godt vil have fx. et datetime felt til at kunne opføre sig som et date
> felt, så man ikke skal vælge tid, men kun dato.

Det ville jeg lave som en overstyret klasse:

class Date {
   function Date ($dt) { ... }
}
class Date {
   function Date ($dt,$hr,$mn,$sc) { ... }
}

men det kan man måske ikke i PHP?

> Kig fx på Zend_Form hvor hvert input type har sin egen klasse, men nogle
> gange så vil man jo gerne have et tekstfelt til at være et datofelt fx.

Hm. Jeg ville ikke blande dem sammen. Kan du ikke nedarve
tekstfeltegenskaberne til en datofeltklasse?

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Martin (26-11-2010)
Kommentar
Fra : Martin


Dato : 26-11-10 14:57

On 26-11-2010 11:34, Bertel Lund Hansen wrote:
> Martin skrev:
>
>> Forstil dig at hver række type i databasen har sin egen klasse, men man
>> godt vil have fx. et datetime felt til at kunne opføre sig som et date
>> felt, så man ikke skal vælge tid, men kun dato.
>
> Det ville jeg lave som en overstyret klasse:

Først bliver der automatisk lavet et Datetime object (dette kører
automatisk, da den hiver oplysningerne direkte fra databasen)

Men når man har fx. et timestamp, datetime felt - så er det jo ikke
altid man vil have den til at vise dato og tidsvælger i HTML'en, men kun
vise dato.

Derfor så skal klassen "omskrives" til at være et Date object istedet

Derfor ville

$obj = new Datetime;
$obj->actAs('date'); // Outputs Date object
ville være helt perfekt og det jeg ønsker - hvis muligt :)

Men måske vil ordet "Advanced Search" kan give et hint til hvad det
egentlig er jeg har inde i mit lille hoved :)

>
> class Date {
>    function Date ($dt) { ... }
> }
> class Date {
>    function Date ($dt,$hr,$mn,$sc) { ... }
> }
>
> men det kan man måske ikke i PHP?

Jo det kan man godt - eller rettere man kan ikke have 2 klasser med
samme navn

>
>> Kig fx på Zend_Form hvor hvert input type har sin egen klasse, men nogle
>> gange så vil man jo gerne have et tekstfelt til at være et datofelt fx.
>
> Hm. Jeg ville ikke blande dem sammen. Kan du ikke nedarve
> tekstfeltegenskaberne til en datofeltklasse?

Det gør jeg skam også

class Advancedsearch_Field_Datetime
extends Advancedsearch_Field_Date
{
protected $class = __CLASS__;

// Ingen $methods her, da den bruger $methods fra Date

/*
MEN, når man så i HTML'en vælger denne type felt, så skal der jo også
komme en time:minut felt op - men man vil jo også gerne have at det ikke
er alle datetime felter der skal komme op med time:minut, men kun med
dato vælger - så her bruger jeg så actAs() for at sige den skal være et
Date (eller det kunne i for sig være et enum felt istedet, det kan man
jo selv vælge)
*/

}


class Advancedsearch_Field_Date
extends Advancedsearch_Field_Text
{
protected $class = __CLASS__;
protected $methods = array(
'is newer than' => '? > ?',
'is older than' => '? < ?'
);
}

class Advancedsearch_Field_Text
extends Advancedsearch_Field_Abstract
{
protected $class = __CLASS__;
protected $methods = array(
'contains' => '? LIKE "%?%"',
'starts with' => '? LIKE "?%"'
);
}

Så er hele koden til at bygge HTML, javascript, database kald osv. i
Abstract

Hvis du vil se hele koden eller rettere det jeg har nået indtil nu så
kan du følge mig på
https://github.com/lsv/Advanced-Search

Michael Rasmussen (26-11-2010)
Kommentar
Fra : Michael Rasmussen


Dato : 26-11-10 15:54

On Fri, 26 Nov 2010 02:56:48 +0100
Martin <maa@scandesigns.invalid> wrote:

>
> Så hvordan ville du gøre det? - Uden at skulle assigne som en ny variabel - Hvis det ellers overhovedet er muligt?
Denne artikel giver dig de svar, du efterspørger:
http://www.devshed.com/c/a/PHP/Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory/

--
Hilsen/Regards
Michael Rasmussen
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.


Søg
Reklame
Statistik
Spørgsmål : 177429
Tips : 31962
Nyheder : 719565
Indlæg : 6407947
Brugere : 218878

Månedens bedste
Årets bedste
Sidste års bedste