Kom ihåg mig?
Home Menu

Menu


PHP getters i klasser, funkar det?

 
 
Ämnesverktyg Visningsalternativ
Oläst 2012-07-24, 19:35 #1
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av orreborre Visa inlägg
Nu vet jag inte vad du egentligen är ute efter men att behöva ange alla godkända egenskaper i __set och __get känns omständigt.

Jag skulle gjort såhär: http://pastebin.com/ZDzJM0NL

Och för att lägga till nya egenskaper som ska kunna sättas definierar du först scopet och sen sätter dem till något defaultvärde i konstruktorn.
Det är ju en rätt grundläggande princip att man alltid måste definiera en klass egenskaper i dess defnition, så att man INTE kan stoppa in nya egenskaper i en klass i runtime.

Det är en del av styrkan med att ha den objektorienterde paradigmen. Man ökar kvaliten på koden mångfalt genom att programspråket stöder denna princip. Jag har aldrig sett något annat sråk som tillåter odefinierade egenskaper i en klass. I enklare imperativa skriptspråk är det vanligt att ha odeklareade/dynamiska variabler, men i objektorienterade språk brukar det i vart fall finnas den implicita tvingande egenskapen (kanske 'restriktionen' på ren svenska).

Att ha getters och setters är till för att man ska kunna ha beräknade egenskaper som ibland kan vara ganska komplexa. Men de ska vara enkla att använda. Man kan vidare ha validering av status på en egenskap genom att använda getters och setters, så man kan kasta en exception om det blir tokigheter.

Det finns även situationer där man ha komplicerade formateringsregler av caption (dvs displayvärden) men man har fortfarande en ganska teknisk grundinformation, typexempel kan vara datum som kan vara lagrat som ett mycket kompakt lagringsformat men som visas med en text som är lätt för en människa att förstå. Andra exempel är "scientific notation" o.s.v. ....

Det är kompilatorns styrka att den hjälper mig att hitta fel under utvecklingsarbetet, jag vill ALDRIG råka ut för att fel smyger med och upptäcks först i produktion. Det är ofta 100-1000 gånger dyrare att åtgärda fel som upptäcks i produktion jämfört med under kodningsfasen eller kravfasen.

Senast redigerad av Conny Westh den 2012-07-24 klockan 19:48
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-24, 21:28 #2
Weaver Weaver är inte uppkopplad
Flitig postare
 
Reg.datum: Aug 2006
Inlägg: 403
Weaver Weaver är inte uppkopplad
Flitig postare
 
Reg.datum: Aug 2006
Inlägg: 403
Citat:
Ursprungligen postat av ConnyWesth Visa inlägg
Jag har aldrig sett något annat sråk som tillåter odefinierade egenskaper i en klass.
Det är därför funktionerna __get/__set kallas för magiska Och magi är just oftast sådant vi vill undvika såvida det inte finns en annan lösning.

Du behöver ju faktiskt inte använda dem och de har ett par nackdelar så som:
- De är långsammare än direkt access eller access via en vanlig funktion
- Det är svårare att skriva bra dokumentation för dem

Den klassiska metoden är att skriva get/set metoder för varje värde du vill exponera och även den metoden jag rekommenderar även om det blir mer knackande på tangentbordet.
Kod:
class Person
{
    private $firstname;

    public function getFirstname()
    {
        return $this->firstname;
    }

    public function setFirstname($firstname)
    {
       $this->firstname = $firstname;
    }
}
Weaver är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-25, 09:58 #3
orreborres avatar
orreborre orreborre är inte uppkopplad
Flitig postare
 
Reg.datum: Apr 2003
Inlägg: 309
orreborre orreborre är inte uppkopplad
Flitig postare
orreborres avatar
 
Reg.datum: Apr 2003
Inlägg: 309
Citat:
Ursprungligen postat av ConnyWesth Visa inlägg
Det är ju en rätt grundläggande princip att man alltid måste definiera en klass egenskaper i dess defnition, så att man INTE kan stoppa in nya egenskaper i en klass i runtime.

Det är en del av styrkan med att ha den objektorienterde paradigmen. Man ökar kvaliten på koden mångfalt genom att programspråket stöder denna princip. Jag har aldrig sett något annat sråk som tillåter odefinierade egenskaper i en klass. I enklare imperativa skriptspråk är det vanligt att ha odeklareade/dynamiska variabler, men i objektorienterade språk brukar det i vart fall finnas den implicita tvingande egenskapen (kanske 'restriktionen' på ren svenska).

Att ha getters och setters är till för att man ska kunna ha beräknade egenskaper som ibland kan vara ganska komplexa. Men de ska vara enkla att använda. Man kan vidare ha validering av status på en egenskap genom att använda getters och setters, så man kan kasta en exception om det blir tokigheter.

Det finns även situationer där man ha komplicerade formateringsregler av caption (dvs displayvärden) men man har fortfarande en ganska teknisk grundinformation, typexempel kan vara datum som kan vara lagrat som ett mycket kompakt lagringsformat men som visas med en text som är lätt för en människa att förstå. Andra exempel är "scientific notation" o.s.v. ....

Det är kompilatorns styrka att den hjälper mig att hitta fel under utvecklingsarbetet, jag vill ALDRIG råka ut för att fel smyger med och upptäcks först i produktion. Det är ofta 100-1000 gånger dyrare att åtgärda fel som upptäcks i produktion jämfört med under kodningsfasen eller kravfasen.
Ja, du missuppfattade vad jag menade.
Jag menade att det känns som en dålig lösning att ha en switch-/if-sats i __get och __set.
Min lösning visar ett sätt att slippa det.
orreborre är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-27, 13:51 #4
Nerix Nerix är inte uppkopplad
Flitig postare
 
Reg.datum: Oct 2010
Inlägg: 398
Nerix Nerix är inte uppkopplad
Flitig postare
 
Reg.datum: Oct 2010
Inlägg: 398
Citat:
Ursprungligen postat av ConnyWesth Visa inlägg
Det är ju en rätt grundläggande princip att man alltid måste definiera en klass egenskaper i dess defnition, så att man INTE kan stoppa in nya egenskaper i en klass i runtime.

Det är en del av styrkan med att ha den objektorienterde paradigmen. Man ökar kvaliten på koden mångfalt genom att programspråket stöder denna princip. Jag har aldrig sett något annat sråk som tillåter odefinierade egenskaper i en klass. I enklare imperativa skriptspråk är det vanligt att ha odeklareade/dynamiska variabler, men i objektorienterade språk brukar det i vart fall finnas den implicita tvingande egenskapen (kanske 'restriktionen' på ren svenska).

Att ha getters och setters är till för att man ska kunna ha beräknade egenskaper som ibland kan vara ganska komplexa. Men de ska vara enkla att använda. Man kan vidare ha validering av status på en egenskap genom att använda getters och setters, så man kan kasta en exception om det blir tokigheter.

Det finns även situationer där man ha komplicerade formateringsregler av caption (dvs displayvärden) men man har fortfarande en ganska teknisk grundinformation, typexempel kan vara datum som kan vara lagrat som ett mycket kompakt lagringsformat men som visas med en text som är lätt för en människa att förstå. Andra exempel är "scientific notation" o.s.v. ....

Det är kompilatorns styrka att den hjälper mig att hitta fel under utvecklingsarbetet, jag vill ALDRIG råka ut för att fel smyger med och upptäcks först i produktion. Det är ofta 100-1000 gånger dyrare att åtgärda fel som upptäcks i produktion jämfört med under kodningsfasen eller kravfasen.
Har du aldrig hört talas om metaprogrammering?
Nerix är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-24, 19:57 #5
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Jag har brutit ut den generella egenskapen att hantera getters och setetrs och lagt det i en abstract Rootklass så andra klasser kan ärva in beteendet och vissa egenskaper.

Så här blev det i min testkod:

Kod:
<?php
///////////////////////////////////////////////////////////////////////////////
// File: AbstractRoot.php
// Class: AbstractRoot
///////////////////////////////////////////////////////////////////////////////
abstract class AbstractRoot
{
    private $_ChildClassname;

	public function __construct($ChildClassname)
	{
		$this->ChildClassname = $ChildClassname;
	}

    public function __set($name, $value)
    {
        switch ($name)
        {
            case 'ChildClassname':
                $this->_ChildClassname = $value;
                break;

            default:
            		// By throwing Exception for undefined property we can enforce strict property definition rules
            		// we also achive better error messages for improved debugging during development
            		// this is necessare because of lack of support for strict properties in php 5.3.15
            		$error = "Error: __set property: " . $name . " not supported by class: " . $this->ChildClassname . "." ;
					throw new Exception($error);
					break;
        }
    }

    public function __get($name)
    {
        switch ($name)
        {
            case 'ChildClassname':
                return $this->_ChildClassname;
                break;

            default:
            		// By throwing Exception for undefined property we can enforce strict property definition rules
            		// we also achive better error messages for improved debugging during development
            		// this is necessare because of lack of support for strict properties in php 5.3.15
            		$error = "Error: __get property: " . $name . " not supported by class: " . $this->ChildClassname . ".";
					throw new Exception($error);
					break;
        }
        return null;
    }
}

?>
Kod:
<?php
///////////////////////////////////////////////////////////////////////////////
// File: Person.php
// Class: Person
///////////////////////////////////////////////////////////////////////////////
class Person extends AbstractRoot
{
    private $firstname;
    private $lastname;

	public function __construct($pFirstname, $pLastname)
	{
		parent::__construct(__CLASS__);

		// Always
		$this->firstname = $pFirstname;
		$this->lastname = $pLastname;
	}

	/* a String representation for every Person. */
	public function __toString()
	{
		return $this->firstname . " " . $this->lastname;
	}
}
?>
Kod:
<?php
///////////////////////////////////////////////////////////////////////////////
// File: PersonAge.php
// Class: PersonAge
///////////////////////////////////////////////////////////////////////////////
class PersonAge extends AbstractRoot
{
    private $firstname;
    private $lastname;
    private $age;

	public function __construct($pFirstname, $pLastname, $pAge)
	{
		parent::__construct(__CLASS__);

		// Always
		$this->firstname = $pFirstname;
		$this->lastname = $pLastname;
		$this->age = $pAge;
	}

	/* a String representation for every PersonAge. */
	public function __toString()
	{
		return $this->firstname . " " . $this->lastname . " (" . $this->age . ")";
	}
}
?>
Kod:
<?php
///////////////////////////////////////////////////////////////////////////////
// File: PropertiesTest.php
// Test for Class: AbstractRoot, Person, PersonAge
///////////////////////////////////////////////////////////////////////////////
class PropertiesTest
{
	public function __construct()
	{
		try
		{
			echo "\nTest of errormessage wehen faulty property ...\n";
			echo "\nStart testing class: Person.\n---------------------------------------\n\n";
			$rad = 0;

			echo "(row) - Firstname Lastname\n";
			# create a PHP Array and initialize it with Person objects
			$persons = array
			(
				new Person("Fredrik", "Framberg"),
				new Person("Greta", "Gavelstam"),
				new Person("Urban", "Urberg"),
				new Person("Anna", "Ambtesteg"),
				new Person("Henrik", "Hammarberg"),
				new Person("Kristina", "Karlestam"),
				new Person("Hans", "Hallin"),
				new Person("Berit", "Bygdén")
			);

			# print out the results - calls Person->__toString().
			foreach($persons as $person) echo "(" . ++$rad . ") - " . "$person\n";
		}
		catch (Exception $e)
		{
			echo 'Caught exception (1): ',  $e->getMessage(), "\n";
		}

		try
		{
			echo "\nTest of creating new object of class Person ...\n";
			$faultyPerson = new Person("Dennis","Harper");
			echo "This message will hopefully be written to console.\n";
		}
		catch (Exception $e)
		{
			echo 'Caught exception (2): ',  $e->getMessage(), "\n";
		}

		try
		{
			echo "\nTest of errormessage when faulty __set property ...\n";
			echo "(" . ++$rad . ") - " . "$faultyPerson\n";
			$faultyPerson->Age = 34;
			$faultyPerson->ShoeSize = 45;
			echo "Age: " . $faultyPerson->Age . " years.\n";
			echo "ShoeSize: " . $faultyPerson->ShoeSize . ".\n";

			echo "This message will not be written to console.\n";
		}
		catch (Exception $e)
		{
			echo 'Caught exception (3): ',  $e->getMessage(), "\n";
		}

		try
		{
			echo "\nTest of errormessage when faulty __get property ...\n";
			echo "(" . ++$rad . ") - " . "$faultyPerson\n";
			echo "ShoeSize: " . $faultyPerson->ShoeSize . ".\n";
			echo "Age: " . $faultyPerson->Age . " years.\n";

			echo "This message will not be written to console.\n";
		}
		catch (Exception $e)
		{
			echo 'Caught exception (4): ',  $e->getMessage(), "\n";
		}

		echo "\nDone testing class: Person.\n---------------------------------------\n\n";

		echo "\nStart testing class: PersonAge.\n---------------------------------------\n\n";
		try
		{
			echo "\nTest of errormessage when faulty __set property ...\n";
			$faultyPersonAge = new PersonAge("Arthur","Trent",47);
			echo "(" . ++$rad . ") - " . "$faultyPersonAge\n";
			$faultyPersonAge->age = 58;
			$faultyPersonAge->ShoeSize = 43;
			echo "ShoeSize: " . $faultyPersonAge->ShoeSize . ".\n";
			echo "Age: " . $faultyPersonAge->age . " years.\n";

			echo "This message will not be written to console.\n";
		}
		catch (Exception $e)
		{
			echo 'Caught exception (5): ',  $e->getMessage(), "\n";
		}

		try
		{
			echo "\nTest of errormessage when faulty __get property ...\n";
			//$faultyPersonAge = new PersonAge("Gary","Middleton",56);
			echo "(" . ++$rad . ") - " . "$faultyPersonAge\n";
			echo "Age: " . $faultyPersonAge->age . " years.\n";
			echo "ShoeSize: " . $faultyPersonAge->ShoeSize . ".\n";

			echo "This message will not be written to console.\n";
		}
		catch (Exception $e)
		{
			echo 'Caught exception (6): ',  $e->getMessage(), "\n";
		}

		echo "\nDone testing class: PersonAge.\n---------------------------------------\n\n";
	}
}

try
{
	$test = new PropertiesTest();
}
catch (Exception $e)
{
	echo 'Caught exception (7): ',  $e->getMessage(), "\n";
}

?>
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-26, 01:34 #6
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Citat:
Ursprungligen postat av ConnyWesth Visa inlägg
Jag har brutit ut den generella egenskapen att hantera getters och setetrs och lagt det i en abstract Rootklass så andra klasser kan ärva in beteendet och vissa egenskaper.

Så här blev det i min testkod:

Kod:
<?php
///////////////////////////////////////////////////////////////////////////////
// File: AbstractRoot.php
// Class: AbstractRoot
///////////////////////////////////////////////////////////////////////////////
abstract class AbstractRoot
{
    private $_ChildClassname;

	public function __construct($ChildClassname)
	{
		$this->ChildClassname = $ChildClassname;
	}

    public function __set($name, $value)
    {
        switch ($name)
        {
            case 'ChildClassname':
                $this->_ChildClassname = $value;
                break;

            default:
            		// By throwing Exception for undefined property we can enforce strict property definition rules
            		// we also achive better error messages for improved debugging during development
            		// this is necessare because of lack of support for strict properties in php 5.3.15
            		$error = "Error: __set property: " . $name . " not supported by class: " . $this->ChildClassname . "." ;
					throw new Exception($error);
					break;
        }
    }

    public function __get($name)
    {
        switch ($name)
        {
            case 'ChildClassname':
                return $this->_ChildClassname;
                break;

            default:
            		// By throwing Exception for undefined property we can enforce strict property definition rules
            		// we also achive better error messages for improved debugging during development
            		// this is necessare because of lack of support for strict properties in php 5.3.15
            		$error = "Error: __get property: " . $name . " not supported by class: " . $this->ChildClassname . ".";
					throw new Exception($error);
					break;
        }
        return null;
    }
}

?>
Kod:
<?php
///////////////////////////////////////////////////////////////////////////////
// File: Person.php
// Class: Person
///////////////////////////////////////////////////////////////////////////////
class Person extends AbstractRoot
{
    private $firstname;
    private $lastname;

	public function __construct($pFirstname, $pLastname)
	{
		parent::__construct(__CLASS__);

		// Always
		$this->firstname = $pFirstname;
		$this->lastname = $pLastname;
	}

	/* a String representation for every Person. */
	public function __toString()
	{
		return $this->firstname . " " . $this->lastname;
	}
}
?>
Kod:
<?php
///////////////////////////////////////////////////////////////////////////////
// File: PersonAge.php
// Class: PersonAge
///////////////////////////////////////////////////////////////////////////////
class PersonAge extends AbstractRoot
{
    private $firstname;
    private $lastname;
    private $age;

	public function __construct($pFirstname, $pLastname, $pAge)
	{
		parent::__construct(__CLASS__);

		// Always
		$this->firstname = $pFirstname;
		$this->lastname = $pLastname;
		$this->age = $pAge;
	}

	/* a String representation for every PersonAge. */
	public function __toString()
	{
		return $this->firstname . " " . $this->lastname . " (" . $this->age . ")";
	}
}
?>
Kod:
<?php
///////////////////////////////////////////////////////////////////////////////
// File: PropertiesTest.php
// Test for Class: AbstractRoot, Person, PersonAge
///////////////////////////////////////////////////////////////////////////////
class PropertiesTest
{
	public function __construct()
	{
		try
		{
			echo "\nTest of errormessage wehen faulty property ...\n";
			echo "\nStart testing class: Person.\n---------------------------------------\n\n";
			$rad = 0;

			echo "(row) - Firstname Lastname\n";
			# create a PHP Array and initialize it with Person objects
			$persons = array
			(
				new Person("Fredrik", "Framberg"),
				new Person("Greta", "Gavelstam"),
				new Person("Urban", "Urberg"),
				new Person("Anna", "Ambtesteg"),
				new Person("Henrik", "Hammarberg"),
				new Person("Kristina", "Karlestam"),
				new Person("Hans", "Hallin"),
				new Person("Berit", "Bygdén")
			);

			# print out the results - calls Person->__toString().
			foreach($persons as $person) echo "(" . ++$rad . ") - " . "$person\n";
		}
		catch (Exception $e)
		{
			echo 'Caught exception (1): ',  $e->getMessage(), "\n";
		}

		try
		{
			echo "\nTest of creating new object of class Person ...\n";
			$faultyPerson = new Person("Dennis","Harper");
			echo "This message will hopefully be written to console.\n";
		}
		catch (Exception $e)
		{
			echo 'Caught exception (2): ',  $e->getMessage(), "\n";
		}

		try
		{
			echo "\nTest of errormessage when faulty __set property ...\n";
			echo "(" . ++$rad . ") - " . "$faultyPerson\n";
			$faultyPerson->Age = 34;
			$faultyPerson->ShoeSize = 45;
			echo "Age: " . $faultyPerson->Age . " years.\n";
			echo "ShoeSize: " . $faultyPerson->ShoeSize . ".\n";

			echo "This message will not be written to console.\n";
		}
		catch (Exception $e)
		{
			echo 'Caught exception (3): ',  $e->getMessage(), "\n";
		}

		try
		{
			echo "\nTest of errormessage when faulty __get property ...\n";
			echo "(" . ++$rad . ") - " . "$faultyPerson\n";
			echo "ShoeSize: " . $faultyPerson->ShoeSize . ".\n";
			echo "Age: " . $faultyPerson->Age . " years.\n";

			echo "This message will not be written to console.\n";
		}
		catch (Exception $e)
		{
			echo 'Caught exception (4): ',  $e->getMessage(), "\n";
		}

		echo "\nDone testing class: Person.\n---------------------------------------\n\n";

		echo "\nStart testing class: PersonAge.\n---------------------------------------\n\n";
		try
		{
			echo "\nTest of errormessage when faulty __set property ...\n";
			$faultyPersonAge = new PersonAge("Arthur","Trent",47);
			echo "(" . ++$rad . ") - " . "$faultyPersonAge\n";
			$faultyPersonAge->age = 58;
			$faultyPersonAge->ShoeSize = 43;
			echo "ShoeSize: " . $faultyPersonAge->ShoeSize . ".\n";
			echo "Age: " . $faultyPersonAge->age . " years.\n";

			echo "This message will not be written to console.\n";
		}
		catch (Exception $e)
		{
			echo 'Caught exception (5): ',  $e->getMessage(), "\n";
		}

		try
		{
			echo "\nTest of errormessage when faulty __get property ...\n";
			//$faultyPersonAge = new PersonAge("Gary","Middleton",56);
			echo "(" . ++$rad . ") - " . "$faultyPersonAge\n";
			echo "Age: " . $faultyPersonAge->age . " years.\n";
			echo "ShoeSize: " . $faultyPersonAge->ShoeSize . ".\n";

			echo "This message will not be written to console.\n";
		}
		catch (Exception $e)
		{
			echo 'Caught exception (6): ',  $e->getMessage(), "\n";
		}

		echo "\nDone testing class: PersonAge.\n---------------------------------------\n\n";
	}
}

try
{
	$test = new PropertiesTest();
}
catch (Exception $e)
{
	echo 'Caught exception (7): ',  $e->getMessage(), "\n";
}

?>

Dummaste jag sett på länge.. Antingen kan du språket/vet vad du gör (oavsett programspråk) eller så kan/vet du inte.. Vad är det för mening med att sätta 200 parametrar som ändå inte används?

PHP-kod:
// styrkan i PHP:
$x = new StdClass();
$x->pelle "ett namn";

// bara dumt!
eval($x->jagtrorjaghittarpanagotsomkanskeintefinnsmendetfunkarsakerteftersomphparjusakassochkontrollavindataharjusakertintemeddettaattgora); 
??

Bygga in skydd/lager-på-lager-på-lager-på-lager mot klantskallar kan ju Java/.NET fortsätta hålla på med tills dom avlider..

Förväntar du dig ett viss datatyp när du sätter en property så får du väl kolla efter det istället? Inte bara om den ens finns "definierad" i klassen.

Senast redigerad av Jake.Nu den 2012-07-26 klockan 01:48
Jake.Nu är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-31, 02:52 #7
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av Jake.Nu Visa inlägg
Dummaste jag sett på länge.. Antingen kan du språket/vet vad du gör (oavsett programspråk) eller så kan/vet du inte.. Vad är det för mening med att sätta 200 parametrar som ändå inte används?

PHP-kod:
// styrkan i PHP:
$x = new StdClass();
$x->pelle "ett namn";

// bara dumt!
eval($x->jagtrorjaghittarpanagotsomkanskeintefinnsmendetfunkarsakerteftersomphparjusakassochkontrollavindataharjusakertintemeddettaattgora); 
??

Bygga in skydd/lager-på-lager-på-lager-på-lager mot klantskallar kan ju Java/.NET fortsätta hålla på med tills dom avlider..

Förväntar du dig ett viss datatyp när du sätter en property så får du väl kolla efter det istället? Inte bara om den ens finns "definierad" i klassen.
Du visar ju prov på att inte förstå programmeringens grunder över huvud taget, så dina kommentarer behöver ingen ens fundera på.

Om du inte begriper objektorienterad programmering så bör du inte komma med fullkomligt idiotiska inlägg här i forumet.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-31, 08:02 #8
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Citat:
Ursprungligen postat av ConnyWesth Visa inlägg
Du visar ju prov på att inte förstå programmeringens grunder över huvud taget, så dina kommentarer behöver ingen ens fundera på.

Om du inte begriper objektorienterad programmering så bör du inte komma med fullkomligt idiotiska inlägg här i forumet.
Jag gjorde mitt inlägg med en viss "twist" tror jag.. Var nog lite naiv som trodde att du skulle förstå vad jag menade, fast nu i efterhand inser jag att du inte kan förstå..
Du vet inte hur PHP (eller dess objekthantering) fungerar så hur skulle du kunna förstå vad jag menade..

Jag begriper däremot inte varför du ens ger dig på att försöka använda PHP, du är så inställd på hur typade och kompilerade språk fungerar och måste jämföra allt med dessa hela tiden.

Senast redigerad av Jake.Nu den 2012-07-31 klockan 08:05
Jake.Nu är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-26, 09:09 #9
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Citat:
Ursprungligen postat av ConnyWesth Visa inlägg
Jag har brutit ut den generella egenskapen att hantera getters och setetrs och lagt det i en abstract Rootklass så andra klasser kan ärva in beteendet och vissa egenskaper.
Ett par kommentarer:
Din abstrakta klass verkar lite omständig. Med switch-satsen måste du uppdatera root-klassen med alla properties för alla underklasser. Du har redan fått ett vettigt exempel med isset() istället, som du faktiskt kan lägga som en abstrakt klass utan att få massa switch cases på ett helt ologiskt ställe. Använder du PHP5.4 kan du använda den som en trait (tyvärr är den inte helt redo för alla produktionsmiljöer pga extensions som apc och patches som suhoshin).

Det finn en väl vedertagen standard för hur man skriver kommentarer för att kunna generera dokumentation i PHP - titta på phpdocumentor.

Liksom för testning har du PHPUnit (allra mest välanvänt) som gör vad du gör i din testklass, fast smidigare, bättre output och enklare att integrera i byggservrar osv.

Dynamiska properties är en styrka hos PHP. Överanvändning av det är en svaghet hos programmeraren. Med början i PHP5.4 finns det en stark anledning till att bli striktare med det då de har optimerat hanteringen av fördefinierade properties rejält.
Clarence är inte uppkopplad   Svara med citatSvara med citat
Oläst 2012-07-31, 05:47 #10
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Så här skulle motsvarande program se ut i C# med de metoder och properties jag var ute efter:

Kod:
using System;
using System.Collections.Generic;

namespace Test
{
	public class Person
	{
		private string _FirstName = "";
		public string FirstName
		{
			get { return _FirstName; }
			set { _FirstName = value; }
		}

		private string _LastName = "";
		public string LastName
		{
			get { return _LastName; }
			set { _LastName = value; }
		}

		public Person(string FirstName, string LastName)
		{
			this.FirstName = FirstName;
			this.LastName = LastName;
		}

		public override string ToString()
		{
			return String.Format("{0} {1}",this.FirstName, this.LastName);
		}
	}
}
Kod:
using System;
using System.Collections.Generic;


namespace Test
{
	class PersonAge : Person
	{
		private int _BirthYear;

		public int BirthYear
		{
			get { return _BirthYear; }
			set { _BirthYear = value; }
		}

		public int Age
		{
			get 
			{
				return (2012 - BirthYear); 
			}
		}

		public PersonAge(string FirstName, string LastName, int BirthYear)
			: base(FirstName, LastName)
		{
			this.BirthYear = BirthYear;
		}

		public override string ToString()
		{
			return String.Format("{0} ({1} år)", base.ToString(), this.Age);
		}
	}
}
Kod:
using System;
using System.Collections.Generic;


namespace Test
{
	class Program
	{
		static void Main(string[] args)
		{

			List<Person> personer = new List<Person>();

			personer.Add(new Person("Fredrik", "Framberg"));
			personer.Add(new Person("Greta", "Gavelstam"));
			personer.Add(new Person("Urban", "Urberg"));
			personer.Add(new Person("Anna", "Ambtesteg"));

			Console.WriteLine("Visa alla Person i personer...");
			foreach (Person person in personer)
			{
				Console.WriteLine(person);
			}

			List<PersonAge> personAges = new List<PersonAge>();
			personAges.Add(new PersonAge("Henrik", "Hammarberg", 1956));
			personAges.Add(new PersonAge("Kristina", "Karlestam", 1983));
			personAges.Add(new PersonAge("Hans", "Hallin", 1967));
			personAges.Add(new PersonAge("Berit", "Bygdén", 1974));

			Console.WriteLine();
			Console.WriteLine("Visa alla PersonAge i personAges...");
			foreach (PersonAge person in personAges)
			{
				Console.WriteLine(person);
			}

			Console.WriteLine();
			Console.WriteLine("Kopiera alla PersonAge till personer...");
			foreach (Person person in personAges)
			{
				personer.Add(person);
			}

			Console.WriteLine();
			Console.WriteLine("Visa alla Person och PersonAge i personer...");
			foreach (Person person in personer)
			{
				Console.WriteLine(person);
			}

			Console.ReadKey();
		}
	}
}
Kod:
Visa alla Person i personer...
Fredrik Framberg
Greta Gavelstam
Urban Urberg
Anna Ambtesteg

Visa alla PersonAge i personAges...
Henrik Hammarberg (56 år)
Kristina Karlestam (29 år)
Hans Hallin (45 år)
Berit Bygdén (38 år)

Kopiera alla PersonAge till personer...

Visa alla Person och PersonAge i personer...
Fredrik Framberg
Greta Gavelstam
Urban Urberg
Anna Ambtesteg
Henrik Hammarberg (56 år)
Kristina Karlestam (29 år)
Hans Hallin (45 år)
Berit Bygdén (38 år)

Senast redigerad av Conny Westh den 2012-07-31 klockan 05:53
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 10:15.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017