В PHP тоже есть глобальные переменные, но их нужно было бы тоже перечислить внутри sum, в дерективе global, но это плохой тон, лучше передать аргументы. Если десять - ничего страшного. Так функция не привязывается к именам $a1 и т.п., Код (PHP): // и один раз вы можете её вызвать так: sum($A1, $A2, $B1, $B2); // а другой так: sum($hren1, $hren2, 45, $hren4); array и list я использовал, поскольку это удобно, когда возвращаемых значений несколько, можно было и без них, опять же с глобальными переменными, но это всё плохой тон. Лучше делать без global, с параметрами и возвращаемыми значениями. А вы просто упорно не хотите даже прочитать, что такое list, что такое array, что такое return и т.п., а сетуете, что язык слишком сложный и непонятный. Если бы прочитали (физику не должно быть сложно прочитать книгу по синтаксису), не возникало бы вопросов, которые вы задаёте --- Добавлено --- Ага, челу, которому сложно вызвать функцию, с ООП будет гораздо проще... --- Добавлено --- @dm_rut руководство по синтаксису php предоставили сами разработчики: https://secure.php.net/manual/ru/langref.php
Что-то вроде: PHP: class Chart { public $A1, $A2, $A3, $B1, $B2, $B3; /** Построение графика CL */ public function Build() { // Исходные данные $pi = 3.14159; $f = 16.3168; for ($x=0; $x <= 650; $x++) { $f = $f * pow(2, 1 / 64); $w = (2 * $pi * $f); $this->A1 = $Rl21; $this->B1 = $w * $L21; $this->A2 = $Rd2; $this->B2 = 0; $this->Sum(); $V1 = $this->A3; $Z1 = $this->B3; $this->A1 = $Rc21; $this->B1 = -1 / $w / $C21; $this->A2 = $V1; $this->B2 = $Z1; $this->Sub(); $y = $w / $C21 - $Rd2; imageSetPixel($img, 20 + $x, 600 - $y, $black); } } /** Сложение */ protected function Sum() { $this->A3 = $this->A1 + $this->A2; $this->B3 = $this->B1 + $this->B2; } /** Вычитание */ protected function Sub() { $this->A3 = $this->A1 - $this->A2; $this->B3 = $this->B1 - $this->B2; } }
Нету никаких ребусов для того, кто знает язык. Вы просто язык не знаете, поэтому для вас всё ребус. Я вообще не знаю теории того дела, которое вы там пытаетесь запрограммировать, но если бы знал, вынес бы все эти формулы в осмысленные функции, типа (на примере той формулы, которую я из физики помню) Код (PHP): function resistance($U, $I) { return $U / $I; } Смысл: каждый раз, видя вызов resistance(...) я бы знал, что здесь у меня считается на кой-то чёрт электрическое сопротивление. Если там нужно считать комплексные числа, то ещё проще, нашёл бы библиотеку, которая работает с комплексными числами, такие есть. Но потому что я знаю язык, мне это легко.
1) Нет там никакого ООП, - просто структура с переменными и функциями. ООП != структура CLASS 2) Человек просто не понял разницу в области видимости переменных между бейсиком и ПХП. Класс позволит ему эмулировать подпрограмму в бейсике через метод. (т.е. избавится от передачи переменных через параметры)
Глобальные переменные тоже, не дополняя теорию. Но это всё плохие советы. Если классы, то должны быть нормальные классы, а не от нечего делать запихаем алгоритм, который, как я подозреваю, на несколько сотен строк, в класс.
С точки зрения PHP, но не с точки зрения ООП. Какую он абстракцию отображает по вашему? Каково состояние и поведение объекта этого класса?
Я же выше написал "ООП != структура CLASS". Каким боком здесь ООП? Думаю, не стоит путать тёплое с мягким.
Ну вообще, классы нужны для реализации возможности строить системы с архитектурой ООП, хотя использовать их можно как угодно. Но я против такого. Вот если бы вы решали задачу с графиком, вы бы так использовали классы? Вообще, я просто не хотел грузить человека дополнительными терминами, а так бы я дал ТС ссылочки на готовые классы, работающие с теми же комплексными числами, если они здесь нужны. Ну и вообще, всё под задачу. Лично я бы посмотрел, что считает конкретно, в физическом смысле, каждая из этих формул, раз уж мы решаем физическую задачу, дал бы соответствующие имена функциям, может быть бы даже создал классы, если в них там есть хоть какой-то смысл, после чего бы получил стройный и красивый самодокументированный цикл.
Угу. Каждый язык имеет свои особенности и ограничения. И когда в них упираешься, приходится выкручиваться. Для ТС наиболее простой способ перевести код с бейсика на ПХП именно через структуру class. --- Добавлено --- Угу. Использование классов вообще заметно облегчает кодирование. Особенно, если у тебя десятки тысяч строк кода.
@Chushkin, Только нормальное использование классов Код (PHP): interface FunctionCalc2d { public function calc($x); } class ChartBuilder { private $img; public function __construct() { /* ... */ } public function draw($x_start, $x_end, $x_step, FunctionCalc2d $calc) { // .... } } class ElectricFilterCalculator implements FunctionCalc2d { // ... }
Общая картина такая: на фиксированном листе с осями координат (ссылку давал) рисуются графики. Какие будут рассчитываться и отображаться выбирает пользователь, в перспективе схем будет пара десятков. Каждой соответствует свой цикл. Чем сложнее (а есть схемы с десятком элементов) - тем длиннее цикл. Формул же, к которым надо ссылаться всего 6, в самом простом случае все формулы используются, в сложных случаях они используются по несколько раз. Если не так, то как ещё это всё организовать? Да, я не разбираюсь в РНР. Хотя уже в состоянии (криво и неправильно) вывести соответствующий действительности график на экран. Хочется сделать это правильно и покороче. Не перегружая код всякими повторениями.
@dm_rut, если схему выбирает пользователь, то это прямо просится на ООП задача, но тут в двух словах не описать, вы не прочитаете всё это. А так: ну прочтите, что такое функции, что такое аргументы и т.п. Мой код после бейсика вас смутил по простой причине: в бейсике все переменные были глобальные, т.е. доступные по всей программе, а в php переменные бывают глобальные (доступные по всей программе) и локальные (доступные только внутри функции), плюсу функций бывают аргументы. Теоретически можно использовать глобальные переменные, но это не гут, лучше передавать данные в функцию через аргументы, как это сделал я (хотя вас и смутили "повторы" списка). А вообще, почитайте руководство по языку, тогда вы будете понимать, что делаете, а не тыкаться. Вот ещё раз ссылка: https://secure.php.net/manual/ru/langref.php. Я не буду начинать изучение немецкого языка с написания на нём технических текстов, даже если это будет целью изучения языка, я начну с изучения того, как сказать "У меня есть собачка, она красивая"
Про локальные переменные я догадался. Но меня вполне устроят глобальные, потому что тогда всегда в любом месте кода можно будет идентифицировать переменную. В Бейсике это было в порядке вещей и сейчас тоже подойдёт. Зато не надо будет их по много раз объявлять. На сайт, на который Вы даёте ссылки, я хожу регулярно. Дело в том, что понимание действительности у всех разное: кто-то изучает чистую теорию и потом генерит решения, а кто-то предпочитает разбирать гарантированно рабочие примеры и на их базе изучать теорию. Конечный результат одинаковый - путь разный.
Ну так там написано, и как в php работать с глобальными переменными. Идёт директива global. Чтобы разбирать готовые примеры, надо знать php
Знать РНР есть смысл, если это поможет писать нормальный код. Хотя бы на уровне того, что я писал в глубокой молодости. Хороший код (как и хороший программист) отличается от плохого краткостью изложения, т.е. отсутствием балласта и бессмысленных повторений. Но представленные примеры не оставляют надежды. Часто это вообще похоже на бред. Сначала надо просто объявить переменные, а потом повторить ещё раз для тех, кто не понял. Через пару строк опять повторить, и ещё раз после прохождения по ссылке. Поскольку в рамках одного цикла таких обращений много, то невозможно избавиться от ощущения изощрённого издевательства. Та же история с повторением $this почти в каждой строке (пост 30). Трудно поверить, что это нормальное программирование. Нет, я конечно верю, что в РНР так принято. Поэтому один цикл доделаю так.
Смешно. Ну так если PHP напрягает, пиши на другом языке - их много. C++, например, тебе подойдёт - там можно без $this.
Где вы в php объявления переменных нашли? Таковых нету. В моём примере было объявление функции, а потом вызов. Одинаковые имена - это случайность, я просто не сильно понимаю, что и зачем там происходит, поэтому оставил ваши имена для сложения. Профит я вам показал - вы потом можете в вызове функции подставлять любые переменные, чего с глобальными переменными сделать не получится. Функция получилась независимая от того, что вы передаёте. Например, можно сделать так: Код (Text): list($a3, $b3) = sum($a1, $b1, $a2, $b2); list($c, $d) = sum($a1, $a3, $a2, $b3); А с вызовом gosub в бейсике вам бы пришлось помучаться с такой задачей, там у вас выбора нету просто.
Да не нужно независимых функций. Туда всегда будет отправляться только один и тот же набор ($A1, $A2, $B1, $B2), а возвращаться всегда только $А3 и $В3. Для всех функций одно и то же. С gosub мучений нет в принципе, эта команда просто отправляет дальнейший расчёт туда, куда указано, а потом возвращает обратно. Там можно вообще ничего не писать, т.е. абсолютно, и продолжить как ни в чём не бывало.