2013-08-13 2 views
1

Когда я создаю экземпляр нескольких объектов в PHP, каждый объект имеет свой собственный метод или будет создан только один метод?Объекты делятся своими методами или имеют свои собственные

Пример:

Class SimpleClass { 
public $attr = 'some value'; 
public function set_attr($val){ 
    $this->attr = $val ; 
} 
} 

$sc1 = new SimpleClass(); 
$sc2 = new SimpleClass(); 
$sc1->set_attr('new value1'); 
$sc2->set_attr('new value2'); 

В этом примере я хочу знать, если каждый SimpleClass объект имеет свой собственный метод set_attr() в памяти или, если есть только один. В JavaScript это можно сделать с прототипом Object. И я хочу знать, так ли это на других языках.

Просто для уточнения: В JavaScript я могу создать метод, основанный на прототипе объекта:

SimpleClass = function() { this.attr = 'old val'; }; 
SimpleClass.prototype.set_attr = function(val) { this.attr = val ; }; 

var sc1 = new SimpleClass(); 
var sc2 = new SimpleClass(); 

sc1.set_attr('new val'); 
sc2.set_attr('new val'); 

В этом примере будет переменная assigend для каждого объекта, sc1 и SC2, но только один метод (set_attr()) будет принадлежать объекту прототипа SimpleClass.

+1

возможно дубликат [прототипичный наследования в PHP (как в JavaScript)] (HTTP: // stackoverflow.com/questions/2192049/prototypal-inheritance-in-php-like-in-javascript) – Ian

ответ

1

Да будет только один метод тотальным.

Однако создание методов в конструкторе или методе возможно, по крайней мере, в Javascript, PHP и C#. Выполнение так иногда видно в Javascript, но я никогда не слышал о том, что это делается на PHP или C#.

В следующих примерах все создаются идентификаторы функций без необходимости и теряются в памяти.

В PHP

<?php 
class WastingMemoryForMethods { 
    public $value = 3; 

    public function __construct() { 
     $this->method1 = function() { 
      return $this->value;   
     }; 

     $this->method2 = function() { 

     }; 

     $this->method3 = function() { 

     }; 
    } 
} 
$a = new WastingMemoryForMethods(); 
echo $a->method1->__invoke(); 
//3 

В Javascript:

function WastingMemoryForMethods() { 
    this.value = 3; 

    this.method1 = function() { 
     return this.value; 
    }; 

    this.method2 = function() { 

    }; 

    this.method3 = function() { 

    }; 
} 

var a = new WastingMemoryForMethods(); 
console.log(a.method1()); 
//3 

В C#

class WastingMemoryForMethods { 
    public int value = 3; 

    public Func<int> method1; 
    public Func<int> method2; 
    public Func<int> method3; 

    public WastingMemoryForMethods() { 
     this.method1 =() => this.value; 
     this.method2 =() => 0; 
     this.method3 =() => 0; 
    } 

    public static void Main(string[] args) { 
     var a = new WastingMemoryForMethods(); 
     Console.WriteLine(a.method1()); 
     //3 
    } 
} 
+0

Ладно, это было то, о чем я тоже думал. У меня не было доказательств того, что это так на всех других языках. – Mottenmann

1

Будет создан только один метод. Он будет вызываться с неявным указателем на объект, на который вы его вызвали.

http://php.net/manual/en/language.oop5.basic.php

+1

Я получаю 404 по этой ссылке. – Scottux

+0

Обновлена ​​ссылка ... thanks @Scottux –

1

Там будет один класс со всеми его методы в памяти, там будет три отдельные экземпляры класса SimpleClass. $ sc1, $ sc2 и $ sc3 будут иметь свои собственные копии метода set_attr. Вызов одного не повлияет на другого. Я считаю, что они обращаются к объекту класса в памяти и его методам, но работают независимо.

Для создания одного экземпляра, который имеет указатель, можно клонировать или скопировать экземпляр:

$sc1 = new SimpleClass(); 
$sc2 = $sc1; 
$sc2->set_attr('something'); 
$sc1->get_attr(); // would return 'something' as $sc2 is a pointer to $sc1 
+0

В javascript цепочка прототипов предназначена для расширения объектов. Чтобы получить более аналогичный ответ - класс ComplexClass extends SimpleClass {} $ sc4 = new ComplexClass(); $ sc4-> set_attr ('something'); -Можно быть похожим.Если вы добавите метод в SimpleClass, он будет доступен для ComplexClass. Однако при создании экземпляра каждый объект является его собственной инкапсуляцией и больше не может быть расширен. – Scottux

+0

Это абсолютно неверно, почему у них есть собственные копии метода? – Esailija

+0

Мне следовало сказать, скорее, области, а не копии. $ this сохраняет отдельные экземпляры, так что вызов метода на одном не изменяет параметры другого или исходного класса. – Scottux

Смежные вопросы