ООП преправяне

dakata__92

Super Moderator
Такааа преправям си един код от нормален PHP в стил ООП. Справих се с основните неща и кода проработи, но както четох да използваш в методите global е пълна глупост, но тъй като преправям кода и функциите ги бях драснал с global-ни променливи в тях сега се чудя как да оправя този проблем, без да им задавам хиляди параметри в скобите.

пример:

PHP:
	public function replace_colors($Inputcolor){
		global $Image, $HexColor, $Compare;
		for ($y=0; $y < $Image['height']; $y++){
			for ($x=0; $x < $Image['width']; $x++){
				if(!preg_match('/'.$Inputcolor.'/',$HexColor[$y][$x])){
					$HexColor[$y][$x] = $Compare;
				}
			}
		}
	}

Как в класът да инициализирам правилно тези променливи, които са глобални. (От днес се занимавам с основи на ООП и вече се хвърлих в дълбоки води.) Като си преправям тази система със сигурност ще науча много, затова го и правя. Въпросът ми е глупав но искам да си направя правилни навици.
 
Инициализирай ги в конструктора (__construct). Прочети за public, private и protected променливи (class properties).
 
Просто ги задаваш като атрибути на класа:
класът:
PHP:
class Color {
public $image, $hexColor, $Compare;
public function replace () {
$Image = $this->image;
$HexColor = $this->hexColor;
//и т.н.
}
}
кодът:
PHP:
$Color = new Color();

$Color->image = '...';
$Color->hexColor = '...';
$Color->Compare = '..';

$Color->replaceColors();

Друга практика е да използваш "гетери" и "сетери":

Код:
//не са видими за този който използва класа
private $hexColor, $image;

public function setHexColor ($value) {
$this->hexColor = $value;
}
public function getHexColor ($val) {
return $this->hexColor;
}
Тук ще можеш да ги задаваш, използвайки методите на класа:

PHP:
$Color->setHexColor = '...';
 
Може би нещо такова, ще свърши работа:

PHP:
class MyClass {
private $Image;
private $HexColor;
private $Compare;

function __construct($Image, $HexColor, $Compare) {
 $this->Image = $Image;
 $this->HexColor = $HexColor;
 $this->Compare  = $Compare;
}

function getImage() {
 return $this->Image;
}

function getHexColor() {
 return $this->HexColor;
}

function getCompare() {
 return $this->Compare;
}

public function replace_colors($Inputcolor){
		for ($y=0; $y < $Image['height']; $y++){
			for ($x=0; $x < $Image['width']; $x++){
				if(!preg_match('/'.$Inputcolor.'/',$HexColor[$y][$x])){
					$HexColor[$y][$x] = $Compare;
				}
			}
		}
	}
}

Не съм пипал твоя метод освен да махна глобалните полета, но трябва и него да си промениш може би да връща някаква стойност?
Може да го използваш така:

PHP:
$a = new MyClass($img, $hex, $comp);
$a->replace_colors($inColor);
 
HunterEx, както си го дал ще получи съобщение за undefined variable в replace_color.
Не можеш да използваш $Image просто така. (защото в самата функция (метод) променливата не е инициализирана)Трябва да бъде $this->image, self::image или да използваш global. .
 
Съжалявам, просто копирах неговата функция и махнах global променливите. Прав си, трява да се използва $this пред полетата.
 
Тези глобални променливи имат своята стойност извън класът в кода и преди и сега така с глобални променливи си работи, но в момента е желателно да премахна глобал и да ги инициализилам някъде. :) А и това са масиви в повечето случаи.
 
Точно това съм се опитал да покажа по-горе, можеш дори да махнеш метода
PHP:
public function replace_colors($Inputcolor){
                for ($y=0; $y < $Image['height']; $y++){
                        for ($x=0; $x < $Image['width']; $x++){
                                if(!preg_match('/'.$Inputcolor.'/',$HexColor[$y][$x])){
                                        $HexColor[$y][$x] = $Compare;
                                }
                        }
                }
        }
}
от кода и да използваш класа само за запазване на информация.

А специално може да прочетеш за registry pattern, който наподобавя глобалните променливи.
 
Тези променливи не ми идват от класът а се взимат от кода и са инициализирани вече когато се вика функцията. Те са от array тип тоест масиви. Немога да ги подам на __construct защото в момента на създаване на обекта те не са инициализирани защото е в началото на кода.
 
кода не ти ли е подреден така?

$obj = new Obekt

инициализиране на няквки неща

$obj->setSomething(...)

$obj->doSometing

?

Ако не, то от какъв код се взимат тези променливи?

Също така: в ООП функции нямаш. Имаш методи (на обекти).
 
Променливите са ми масиви. Взимат се след обработка на цикли. Когато викам методите те зи променливи вече са заредени с данни и, когато са глобални си работи. Мисля да си ги подавам на методите, което е глупаво ама няма как явно.
 
Мисля, че изобщо не схващаш ООП :) За теб това е просто "набор от функции"... Нищо не казваш къде се зареждат тези променливи, как си подредил нещата. И защо не направиш някой клас да се грижи за тези променливи.

Напиши си обектите с методите (от нулата, като може да копираш логика, разбира се) - в отделен проект. Помисли как ще взаимодействат (обектите) един с друг.
 
djman каза:
Мисля, че изобщо не схващаш ООП :) За теб това е просто "набор от функции"... Нищо не казваш къде се зареждат тези променливи, как си подредил нещата. И защо не направиш някой клас да се грижи за тези променливи.

Напиши си обектите с методите (от нулата, като може да копираш логика, разбира се) - в отделен проект. Помисли как ще взаимодействат (обектите) един с друг.

Ти май не схвана какво написах. Точно това направих просто желая да премахна global от класът. не съм дал целият код защото е общо 1000 реда и съм дал само един примерен метод чисто формално да попитам как да го премахна. Не мога да използвам __constructor при създаване на обекта защото, в кода в който викам обекта повечето променливи не са инициализирани и нямат никаква стойност. В момента си работи всичко, но не е правилно в клас да се слага global а просто си преправих функциите, които вече имах за да са обектно ориентирани тоест направих ги методи. Остава ми само проблема с въпростине променливи да го преработя и ще съм преправил обикновенният код на ООП стил. Ето още един метод:

PHP:
	public function filter($y,$x){
		global $HexColor, $Compare;
		if($HexColor[$y][$x] != $Compare){
			if(isSet($HexColor[$y-1][$x],$HexColor[$y+1][$x],$HexColor[$y][$x-1],$HexColor[$y][$x+1])){
				if($HexColor[$y-1][$x] == $Compare && $HexColor[$y+1][$x] == $Compare && $HexColor[$y][$x-1] == $Compare && $HexColor[$y][$x+1] == $Compare){
					$HexColor[$y][$x] = $Compare;
				}
			}
		}
		return $HexColor[$y][$x];
	}
 
Ти прочете ли за public, protected и private атрибути на клас?

Няма абсолютно никакво значение, че не са инициализирани по време на създаване на обекта. Ама никакво. Прочете ли за гетъри и сетъри?
 
Ще се включа и аз по темата, въпреки че и на мене ООП-то ми е дива индия :) , така че ако говоря глупости не ми се смейте много. Та за да избегнеш глобалите, трябва да си направиш един клас по шаблона регистри, както беше отбелязал Хънтъра по горе в коментарите. Той се прави със статични методи и свойства, на които пък целта им е да могат да се викат от всякъде. Точно този шаблон решава твоя проблем с глобалните променливи, за което е и създаден.
 
djman каза:
Ти прочете ли за public, protected и private атрибути на клас?

Няма абсолютно никакво значение, че не са инициализирани по време на създаване на обекта. Ама никакво. Прочете ли за гетъри и сетъри?

Примерно на страницата index.php имам код:
PHP:
include_once('class.php');

$Obect = new Class();

.
.
.
//Обработка на някакъв код който вади променлива (Масив)

... Още код води други променливи

$Obect->replace_colors($Inputcolor);

В class.php
PHP:
class Class{

	public function replace_colors($Inputcolor){
		global $Image, $HexColor, $Compare;
		for ($y=0; $y < $Image['height']; $y++){
			for ($x=0; $x < $Image['width']; $x++){
				if(!preg_match('/'.$Inputcolor.'/',$HexColor[$y][$x])){
					$HexColor[$y][$x] = $Compare;
				}
			}
		}
	}

}

global $Image, $HexColor, $Compare;
Тези променливи идват он index.php - Масив, Масив, Стринг.

Или трябва някак в index.php да направя нещо подобно, което пробвах и не работеше:
Код:
$Obect->replace_colors($Inputcolor,$Image,$HexColor,$Compare);
и в класът да преправя метода :
Код:
public function replace_colors($Inputcolor,$Image,$HexColor,$Compare){
		//global $Image, $HexColor, $Compare;
		for ($y=0; $y < $Image['height']; $y++){
Та имам доста такъв код за преправяне. Прочетох за какво се ползват public,private, protected и това не ми е проблема.
 
Точно този код "Обработка на някакъв код който вади променлива (Масив)" трябва да го направиш със статични методи и свойства. И след като са статични можеш да ги викаш където си пожелаеш. Изгледай го това филмче на гатака точно 10 мин е и ще разбереш за какво иде реч gatakka.eu/?p=909
 
teroristd каза:
Точно този код "Обработка на някакъв код който вади променлива (Масив)" трябва да го направиш със статични методи и свойства. И след като са статични можеш да ги викаш където си пожелаеш. Изгледай го това филмче на гатака точно 10 мин е и ще разбереш за какво иде реч gatakka.eu/?p=909
Точно такъв статичен код е просто някакви цикли.
 
Сигурно не ме разбра. Като казвам статични нямам предвид някакъв процедурен код, който може да е каквото и да е. Статичните методи и свойства в ООП са един вид специални. Те са видими навсякъде в кода все едно са глобални променливи. Не знам как да го обясня за да ме разбереш за това ти дадох тази препратка, там човека го обяснява много добре.
 
teroristd каза:
Сигурно не ме разбра. Като казвам статични нямам предвид някакъв процедурен код, който може да е каквото и да е. Статичните методи и свойства в ООП са един вид специални. Те са видими навсякъде в кода все едно са глобални променливи. Не знам как да го обясня за да ме разбереш за това ти дадох тази препратка, там човека го обяснява много добре.
Ок зацепих какво имаше в предвид и се извинявам. Добре но как от процедурният код да дам такава static променлива за обработка в класът ?
 

Back
Горе