Въпрос относно ООП

S_Xu6THuK

Registered
Здравейте!
Не мога да си обесня едни процеси, чрез ООП, та за това ще попитам тук.
PHP:
<?php
    class Class {
        private static $instance = null;
        
        private function __construct() {}

        private $masiv = array();
    
        public static function getInstance()
        {
            if(self::$instance == null) {
                self::$instance = new Toto();
            }
        setArray($vhodni){
        }
        outArray{
        return $masiv;
        }
            return self::$instance;
        }
    }


    $class = Class::getInstance();
    $class::setArray(array(1, 2, 3, 4);
    print_r($class::outArray());
?>
Идеята е, когато викна setArray, да задам стойност на променливата $masiv. При outArray искам да имам достъп до тази променлива и евентуално да извършвам някакви операции над нея, както и да я изкарам на екрана. Проблема ми се изразява в грешки, най-често
Fatal error: Access to undeclared static property
или променливата остава празна, та затова оставям отговора на вас.
Благодаря предварително! :)
 
Колега, като ти гледам кода не ми става ясно дали си по-напред в ООП-а и затова го ползваш по този начин и се чудиш защо не става или не си съвсем наясно какво и как се прави в този клас и искаш да ти се преправи до работещ код?
Поздрави :)
 
Преработвам съществуващ, в интерес на истината.
Съдейки по твоето мнение - пропускам нещо?
Имам известен опит в ООП, но в никакъв случай не се определям като напреднал.
 
Колегата ще се явява на интервю май май :) ????
getInstance ти връща инстанцията на даденият клас със клас данните за печелившите числа от тото и колонките с маркираните числа.
Двата метода трябва да са ти статични.
Идва въпроса : Аджеба как ще вземеш числата да направиш проверката, след като методите са ти статични.
Щом един метод / данна ти е статична, тя не зависи от инстанцията.
Методите ти трябгва да са статични , и да сложиш на една променлива инстанцията->клас_данната

пример :
PHP:
public static function method($array)
{

$instance =  getInstance(); 
   $instance->totoWinNumbers =  $array;
}
http://www.introprogramming.info/wp-content/uploads/2011/07/Intro-CSharp-Book-1.00.pdf
570 страница.
+
http://en.wikipedia.org/wiki/Singleton_pattern
 
Ето ти го работещ.
Код:
<?php
    class Toto {
        private static $instance = null;
        private function __construct() {}
        private $masiv = array();
        public static function getInstance()
        {
            if(self::$instance == null) {
                self::$instance = new Toto();
            }
			return self::$instance;
		}	
        public function setArray($vhodni){
			$this->masiv = $vhodni;
        }
        public function outArray(){
			return $this->masiv;
        }
    }
    $class = Toto::getInstance();
    $class->setArray(array(1, 2, 3, 4));
    print_r($class->outArray());
?>
Ако ще ходиш на интервю не се занимавай със сингълтони, фабрики и подобни. По-добре научи основата и тогава гледай по-напреднали шаблони.
 
Благодаря за отговорите!
Да това е задача от интервю, но се породи интерес в мен относно този метод и исках да го изясня. Все още не мога да го схвана, но продължавам да препрочитам от колегата линк-а, както и да опитам да си конструирам подобна програмка. Ако някой има свободно време и има желание да отговаря на моите въпроси - ще черпя :)
 
1) Статичните данни не зависят от инстацията. Тоест имаш
public static $integer;
Слагащ му някаква стойност 5.
Колкото и пъти да направиш
$instance = new ClassName();
$instance2 = new ClassName();
$intstanceX = new ClassName();
Тази данна няма да се промени, докато ти не й кажеш.
[Статичните данни са полезни , също и ако желаеш да създадеш брояч , който да показва колко пъти е създадена инстанцията ]
2)Сега идеята на singleton е да се създаде само една инстанция от този клас.Не повече. Това е полезно примерно клас , който облужва базата ти данни, примерно... Все пак нямаш нужда от 100 връзки към една и съща база данни на един сървър, нали ?
И сега идва парадокса. В този клас има данна
private static $instance = null; ,която по подразбиране е празна. Тази данна , ще държи самата инстанция на този клас. Данна от класа ClassName да държи инстанцията към самият него.Затова конструктора е видим само за този клас. За да не може отвън да се създаде инстанция.

Прави се проверка : ако данната е празна, да създаде инстанция и да я присвои. Ако не е празна - тогава просто да върне вече създадената инстанция.
3) След като е създадена инстанция, тя има примерно
public $string = ""; който си го сетваш ти, чрез някакъв метод.За валидизация на входните данни, няма да говоря, доста често се проспуска в php, а и прихващането на греки не е заложено в инстанцията.


За да се обърнеш към даден елемент се използват 2пъти по 2 точки.
$toto = Toto::getInstance(); // обръщаш се направо към метода , който да ти създаде инстанцията, тъй като конструктора е забранен за външно ползване.

След това ако ти трябва дадена данна или метод използваш инстанцията която е върната от Toto::getInstance() и е присвоена на $toto
Следовално $toto ти държи тази променлива string която дадох по-горе като пример.
print_r($toto->string); // ще върне [] , това което е в скобите.
Ако след това сложиш някакъв текст : $toto->string = " текст" ;
то следващият print_r($toto->string) // ще върне [текст] , защото string не е статична данна , а зависяща от инстанцията.


По-горе Сенсей ти е дал , работещ код.Разгледай го по-внимателно и се опитай да го разбереш. "Поиграй " си с него малко. Нещата не са сложни, а леко абсрактни.
 
Тоест разликата е, че не можеш да я викаш когато искаш, а я викаш в една променлива, чрез която си викаш и неща от нея
PHP:
<?php
    class Toto {
        private static $instance = null;
        private function __construct() {}
        private $masiv = array();
        public static function getInstance()
        {
            if(self::$instance == null) {
                self::$instance = new Toto();
            }
         return self::$instance;
      }   
        public function setArray($vhodni){
         $this->masiv = $vhodni;
        }
        public function outArray(){
         return $this->masiv;
        }
    }
    $class = Toto::getInstance();
    $class->setArray(array(1, 2, 3, 4));
    print_r($class->outArray());
?>
Ако в този код искам да видя стойността на $masiv в реда след setArray, трябва да напиша $class->masiv;
 
S_Xu6THuK каза:
Тоест разликата е, че не можеш да я викаш когато искаш, а я викаш в една променлива, чрез която си викаш и неща от нея
PHP:
<?php
    class Toto {
        private static $instance = null;
        private function __construct() {}
        private $masiv = array();
        public static function getInstance()
        {
            if(self::$instance == null) {
                self::$instance = new Toto();
            }
         return self::$instance;
      }   
        public function setArray($vhodni){
         $this->masiv = $vhodni;
        }
        public function outArray(){
         return $this->masiv;
        }
    }
    $class = Toto::getInstance();
    $class->setArray(array(1, 2, 3, 4));
    print_r($class->outArray());
?>
Ако в този код искам да видя стойността на $masiv в реда след setArray, трябва да напиша $class->masiv;
С $class->masiv няма да можеш. Но път за това имаш създадени set /get методи.

print_r($class->outArray());
Всичко би трябвало да е okey
 
Не говоря относно самата програма, тоест аз направих заданието което трябваше, но просто искам да си изясня всичко. Това което разбрах, е че използваш променливата, чрез която съм викнал getInstance за по-нататъчните действия.
 
S_Xu6THuK каза:
Не говоря относно самата програма, тоест аз направих заданието което трябваше, но просто искам да си изясня всичко. Това което разбрах, е че използваш променливата, чрез която съм викнал getInstance за по-нататъчните действия.
Да. Този метод , създава и държи единствената инстанция на този клас.
След като я присвоиш на дадена променлива, използваш тази променлива за да се обръщаш към обекти на даденият клас.
 
Уау, Сенсей ме нарекоха и ми стана мило. Щом става въпрос за работа да ти напиша какви ти бяха грешките. Беше се опитал да вкараш функция в метод и при това беше забравил да напишеш function. И искаше да я повикаш от инстанцията отвън. Ако искаш да пишеш функции във функция може, няма проблем. Но областта им на действие ще е само в самия метод. Предположих, че не е това и го поправих.
А ако ти е интересно може да пробваш това. Function във function.
Код:
class A{
	public function method(){
		function inside(){
			return 'test';
		}
		echo inside();
	}
}
$a = new A;
$a->method();
 

Back
Горе