<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sv">
	<id>https://wiki.linux.se/index.php?action=history&amp;feed=atom&amp;title=Kovarians_och_kontravarians</id>
	<title>Kovarians och kontravarians - Versionshistorik</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.linux.se/index.php?action=history&amp;feed=atom&amp;title=Kovarians_och_kontravarians"/>
	<link rel="alternate" type="text/html" href="https://wiki.linux.se/index.php?title=Kovarians_och_kontravarians&amp;action=history"/>
	<updated>2026-04-28T23:56:30Z</updated>
	<subtitle>Versionshistorik för denna sida på wikin</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://wiki.linux.se/index.php?title=Kovarians_och_kontravarians&amp;diff=3242&amp;oldid=prev</id>
		<title>Admin: /* Kovarians och kontravarians */</title>
		<link rel="alternate" type="text/html" href="https://wiki.linux.se/index.php?title=Kovarians_och_kontravarians&amp;diff=3242&amp;oldid=prev"/>
		<updated>2024-08-19T05:46:36Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Kovarians och kontravarians&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;sv&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Äldre version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Versionen från 19 augusti 2024 kl. 05.46&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l7&quot;&gt;Rad 7:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Rad 7:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;En typdeklaration anses vara mer specifik i följande fall:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;En typdeklaration anses vara mer specifik i följande fall:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* En typ tas bort från en unionstyp&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* En typ tas bort från en &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;unionstyp&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* En typ läggs till i en intersectionstyp&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* En typ läggs till i en &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;intersectionstyp&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* En klass-typ ändras till en barnklass-typ&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* En klass-typ ändras till en &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;barnklass-typ&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* iterable ändras till array eller Traversable&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* iterable ändras till array eller &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;Traversable&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;En typklass anses vara mindre specifik om motsatsen är sann.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;En typklass anses vara mindre specifik om motsatsen är sann.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linux.se/index.php?title=Kovarians_och_kontravarians&amp;diff=3241&amp;oldid=prev</id>
		<title>Admin: Skapade sidan med &#039;== Kovarians och kontravarians ==  I PHP 7.2.0 introducerades partiell kontravarians genom att ta bort typrestriktioner för parametrar i en barnmetod. Från och med PHP 7.4.0 lades fullt stöd för kovarians och kontravarians till.  Kovarians tillåter att en barns metod returnerar en mer specifik typ än returtypen för dess förälders metod. Kontravarians å andra sidan tillåter att en parametertyp är mindre specifik i en barns metod än i dess förälders metod....&#039;</title>
		<link rel="alternate" type="text/html" href="https://wiki.linux.se/index.php?title=Kovarians_och_kontravarians&amp;diff=3241&amp;oldid=prev"/>
		<updated>2024-08-19T05:45:57Z</updated>

		<summary type="html">&lt;p&gt;Skapade sidan med &amp;#039;== Kovarians och kontravarians ==  I PHP 7.2.0 introducerades partiell kontravarians genom att ta bort typrestriktioner för parametrar i en barnmetod. Från och med PHP 7.4.0 lades fullt stöd för kovarians och kontravarians till.  Kovarians tillåter att en barns metod returnerar en mer specifik typ än returtypen för dess förälders metod. Kontravarians å andra sidan tillåter att en parametertyp är mindre specifik i en barns metod än i dess förälders metod....&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ny sida&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Kovarians och kontravarians ==&lt;br /&gt;
&lt;br /&gt;
I PHP 7.2.0 introducerades partiell kontravarians genom att ta bort typrestriktioner för parametrar i en barnmetod. Från och med PHP 7.4.0 lades fullt stöd för kovarians och kontravarians till.&lt;br /&gt;
&lt;br /&gt;
Kovarians tillåter att en barns metod returnerar en mer specifik typ än returtypen för dess förälders metod. Kontravarians å andra sidan tillåter att en parametertyp är mindre specifik i en barns metod än i dess förälders metod.&lt;br /&gt;
&lt;br /&gt;
En typdeklaration anses vara mer specifik i följande fall:&lt;br /&gt;
&lt;br /&gt;
* En typ tas bort från en unionstyp&lt;br /&gt;
* En typ läggs till i en intersectionstyp&lt;br /&gt;
* En klass-typ ändras till en barnklass-typ&lt;br /&gt;
* iterable ändras till array eller Traversable&lt;br /&gt;
&lt;br /&gt;
En typklass anses vara mindre specifik om motsatsen är sann.&lt;br /&gt;
&lt;br /&gt;
== Kovarians ==&lt;br /&gt;
För att illustrera hur kovarians fungerar skapas en enkel abstrakt föräldraklass, Animal. Animal kommer att utökas av barnklasserna Cat och Dog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
abstract class Animal&lt;br /&gt;
{&lt;br /&gt;
    protected string $name;&lt;br /&gt;
&lt;br /&gt;
    public function __construct(string $name)&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;name = $name;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    abstract public function speak();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Dog extends Animal&lt;br /&gt;
{&lt;br /&gt;
    public function speak()&lt;br /&gt;
    {&lt;br /&gt;
        echo $this-&amp;gt;name . &amp;quot; skäller&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cat extends Animal &lt;br /&gt;
{&lt;br /&gt;
    public function speak()&lt;br /&gt;
    {&lt;br /&gt;
        echo $this-&amp;gt;name . &amp;quot; jamar&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observera att det inte finns några metoder som returnerar värden i detta exempel. Några fabriker kommer att läggas till som returnerar ett nytt objekt av klassen Animal, Cat, eller Dog.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
interface AnimalShelter&lt;br /&gt;
{&lt;br /&gt;
    public function adopt(string $name): Animal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class CatShelter implements AnimalShelter&lt;br /&gt;
{&lt;br /&gt;
    public function adopt(string $name): Cat // istället för att returnera klass-typen Animal, kan den returnera klass-typen Cat&lt;br /&gt;
    {&lt;br /&gt;
        return new Cat($name);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class DogShelter implements AnimalShelter&lt;br /&gt;
{&lt;br /&gt;
    public function adopt(string $name): Dog // istället för att returnera klass-typen Animal, kan den returnera klass-typen Dog&lt;br /&gt;
    {&lt;br /&gt;
        return new Dog($name);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$kitty = (new CatShelter)-&amp;gt;adopt(&amp;quot;Ricky&amp;quot;);&lt;br /&gt;
$kitty-&amp;gt;speak();&lt;br /&gt;
echo &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$doggy = (new DogShelter)-&amp;gt;adopt(&amp;quot;Mavrick&amp;quot;);&lt;br /&gt;
$doggy-&amp;gt;speak();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovanstående exempel kommer att ge följande utskrift:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ricky jamar&lt;br /&gt;
Mavrick skäller&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kontravarians ==&lt;br /&gt;
Vi fortsätter med föregående exempel med klasserna Animal, Cat, och Dog. En klass som heter Food och AnimalFood kommer att inkluderas, och en metod `eat(AnimalFood $food)` läggs till i den abstrakta klassen Animal.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
class Food {}&lt;br /&gt;
&lt;br /&gt;
class AnimalFood extends Food {}&lt;br /&gt;
&lt;br /&gt;
abstract class Animal&lt;br /&gt;
{&lt;br /&gt;
    protected string $name;&lt;br /&gt;
&lt;br /&gt;
    public function __construct(string $name)&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;name = $name;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function eat(AnimalFood $food)&lt;br /&gt;
    {&lt;br /&gt;
        echo $this-&amp;gt;name . &amp;quot; äter &amp;quot; . get_class($food);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
För att visa hur kontravarians fungerar, överskrids metoden `eat` i klassen Dog för att tillåta vilken Food-typ som helst. Klassen Cat förblir oförändrad.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
class Dog extends Animal&lt;br /&gt;
{&lt;br /&gt;
    public function eat(Food $food) {&lt;br /&gt;
        echo $this-&amp;gt;name . &amp;quot; äter &amp;quot; . get_class($food);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nästa exempel kommer att visa hur kontravarians fungerar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$kitty = (new CatShelter)-&amp;gt;adopt(&amp;quot;Ricky&amp;quot;);&lt;br /&gt;
$catFood = new AnimalFood();&lt;br /&gt;
$kitty-&amp;gt;eat($catFood);&lt;br /&gt;
echo &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$doggy = (new DogShelter)-&amp;gt;adopt(&amp;quot;Mavrick&amp;quot;);&lt;br /&gt;
$banana = new Food();&lt;br /&gt;
$doggy-&amp;gt;eat($banana);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovanstående exempel kommer att ge följande utskrift:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ricky äter AnimalFood&lt;br /&gt;
Mavrick äter Food&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Men vad händer om `$kitty` försöker äta `$banana`?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$kitty-&amp;gt;eat($banana);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovanstående exempel kommer att ge följande utskrift:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Fatal error: Uncaught TypeError: Argument 1 passed to Animal::eat() must be an instance of AnimalFood, instance of Food given&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
= Sidslut =&lt;br /&gt;
Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.oop5.variance.php&lt;br /&gt;
&amp;lt;BR&amp;gt;[[PHP]]&lt;br /&gt;
&amp;lt;BR&amp;gt;[[Språkreferens]]&lt;br /&gt;
&amp;lt;BR&amp;gt;[[Språkreferens#Klasser_och_Objekt]]&lt;br /&gt;
[[Kategori:Php]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;BR&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på &lt;br /&gt;
https://www.linux.se/kontaka-linux-se/&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>