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

Еми трябва да си направиш отделен клас в който да ти се извършва обработката. Демек Всякаквите цикли и други работи които имаш. И там тези
$Image, $HexColor, $Compare; си ги правиш статични. Също и функциите. За това ти дадох препратката изгледай филмчето и ще ти стане много по ясно. Аз съм бос на тая тема както казах :D и няма да мога да ти помогна особено. ООП-то не е толкова просто колкото изглежда на пръв поглед. Сложното е точно това да съумееш да си подредиш правилно класовете не толкова самия синтаксис.
 
off:
Научи се на принципите на ООП, синтаксис, идеи,... после преправяй процедурен код към ооп - и има ли нужда изобщо? В момента се опитваш да направиш огромен рефакторинг и не мисля че това е добра идея да навлезеш в ООП света.

Това е моят съвет към теб (можеш да не отговаряш) :) Успех!
 
teroristd каза:
Еми трябва да си направиш отделен клас в който да ти се извършва обработката. Демек Всякаквите цикли и други работи които имаш. И там тези
$Image, $HexColor, $Compare; си ги правиш статични. Също и функциите. За това ти дадох препратката изгледай филмчето и ще ти стане много по ясно. Аз съм бос на тая тема както казах :D и няма да мога да ти помогна особено. ООП-то не е толкова просто колкото изглежда на пръв поглед. Сложното е точно това да съумееш да си подредиш правилно класовете не толкова самия синтаксис.
Ясно щеее трябва цяластна преработка и на процедурният код за да пасне с ООП :)
 
Принципно така трябва, въпреки че и в ООП пак си пишеш процедурен код един вид. Пак си правиш цикли, масиви, работа със стрингове и всякакви други неща но ги правиш във обекти които взаимодействат по между си. А шаблоните за дизайн са един вид решения на даден проблем. В твоя случай шаблона регистри решава проблема с глобалните променливи. Той от своя страна може да се комбинира с други шаблони ако е необходимо и така. Демек ти може и да си измислиш свое решение но то ще е един вид друга имплементация на същия шаблон.
 
Мисля, че автора просто не успял да се изрази правилно.

Предполагам проблема му е НЕ как да вмъкне глобалните променливи в класа си, а как да присвои на тези глобални резултата от функциите му.

Лично аз бих подходил по следния начин:
classes.php
PHP:
<?php
class ColorReplacer {
	protected $Image;
	protected $HexColor;
	protected $Compare;
	
	public function __construct($Image, $HexColor, $Compare) {
		$this->Image = $Image;
		$this->HexColor = $HexColor;
		$this->Compare = $Compare;
	}

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

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

class ColorFilter {
	protected $HexColor;
	protected $Compare;

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

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

	public function FilterColors($y,$x) { // Нямам идея дали реално филтрираш някакви цветове...
        if($this->HexColor[$y][$x] != $this->Compare){
	        if(isSet($this->HexColor[$y-1][$x],$this->HexColor[$y+1][$x],$this->HexColor[$y][$x-1],$this->HexColor[$y][$x+1])){
                if($this->HexColor[$y-1][$x] == $this->Compare && $this->HexColor[$y+1][$x] == $this->Compare && $this->HexColor[$y][$x-1] == $this->Compare && $this->HexColor[$y][$x+1] == $this->Compare) {
                        $this->HexColor[$y][$x] = $this->Compare;
                }
	        }
        }
    }
}
index.php
PHP:
include_once('class.php');
// Дефинираш си HexColor, Compare и останалите променливи
$HexColor = array(...);
$Compare = 'foobar';
// Не знам в какъв ред извикваш тези функции, но да кажем, че първо филтрираш, после заменяш цветовете
$x = 1, $y = 2;

$ColorFilter = new ColorFilter($HexColor, $Compare);
$ColorFilter->FilterColors($y,$x);
$HexColor = $ColorFilter->getHexColor();

$Image = 'something..';
$InputColor = '#123112';

$ColorReplacer = new ColorReplacer($Image, $HexColor, $Compare);
$ColorReplacer->ReplaceColors($InputColor);
$HexColor = $ColorReplacer->getHexColor();

// Продължаваш...

Естествено има какво да се подобрява. Примерно може да следваш SOLID принципите и прочие...
 
Въпрос. Защо $this->y_busy[] = $y; не присвоява нищо на променливата в този метод?

PHP:
class bla{

	private $y_busy;

	public function printImage(){
		echo "<pre class='imgcode'>";
		$freeHeight = 0; //Брояч за свободни редове по широчина.
		for ($y=0,$t=0; $y < $this->Image['height']; $y++){
			echo "<br>";
			$freeHeight = 0;
			for ($x=0; $x < $this->Image['width']; $x++){
				$this->filter($y,$x);
				if($this->HexColor[$y][$x] == $this->Compare){ 
					echo $this->HexColor[$y][$x];
					$freeHeight++;
				}
				else{
					echo $this->HexColor[$y][$x];
					$freeHeight--;
				}
			}
			//Проверка за свободен от пиксели ред.
			if($freeHeight == $this->Image['width']){
				echo " <b>Height проверка= <font color='green'>".$y."</font> празен.</b>";
			}
			else{
				echo " <b>Height проверка = <font color='red'>".$y."</font> зает.</b>";
				$this->y_busy[] = $y;
			}
		}
		echo "</pre>";
	}

}

Трябва да се получи такъв масив но уви... Notice: Undefined variable: y_busy
PHP:
(
    [0] => 6
    [1] => 7
    [2] => 8
    [3] => 9
    [4] => 10
    [5] => 11
    [6] => 12
    [7] => 13
    [8] => 14
    [9] => 30
    [10] => 31
    [11] => 32
    [12] => 33
    [13] => 34
    [14] => 35
    [15] => 51
    [16] => 52
    [17] => 53
    [18] => 54
    [19] => 55
    [20] => 56
    [21] => 57
    [22] => 58
    [23] => 59
    [24] => 60
    [25] => 61
    [26] => 75
    [27] => 76
    [28] => 77
    [29] => 78
    [30] => 79
    [31] => 80
    [32] => 81
    [33] => 82
    [34] => 83
)
 
$this->y_busy[] = $y;

тук ли се получава notice-a? Или пишеш printr_($y_busy) вместо printr($this->y_busy) ?

@terroristd, и без инициализиране работи (но е хубаво да се прави).
 
djman каза:
$this->y_busy[] = $y;

тук ли се получава notice-a? Или пишеш printr_($y_busy) вместо printr($this->y_busy) ?

@terroristd, и без инициализиране работи (но е хубаво да се прави).

$this->y_busy[] = $y;

Това е редът където се получава Notice.
 

Back
Горе