Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
63 / 63 / 2
Регистрация: 10.03.2014
Сообщений: 73

Функции внутри методов или использовать приватные методы?

01.10.2015, 18:05. Показов 2367. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Как правильно спроектировать код в ООП стиле.

Поместить функцию внутрь метода, к примеру вот так:

PHP
1
2
3
4
5
6
7
8
9
10
11
class MyClass {
    public function calcSize ($length) {
    function makeSomething($lenght){
        ...
        }
        ...calc something...
        $important_value = makeSomething($length);
        ...calc something...
        return $some_variable;
    }
}
или функции function makeSomething($lenght) вынести в отдельный приватный метод, то есть вот так:

PHP
1
2
3
4
5
6
7
8
9
10
11
class MyClass {
    private function makeSomething($lenght){
        ...
        }
    public function calcSize ($length) {
        ...calc something...
        $important_value = makeSomething($length);
        ...calc something...
        return $some_variable;
    }
}
Функции внутре методов понравилось делать после JS, там весьма удобно удобно все реализовывется. Прошу просвятить меня, как правильно делать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.10.2015, 18:05
Ответы с готовыми решениями:

Будет ли корректным вызывать внутри методов get или set другие функции или менять свойства контролов?
Всем привет. Скажите разрешается, не в том смысле, что понятно все разрешено, а будет ли корректным вызывать внутри методов get или set...

AsyncTask. Можно ли использовать методы return внутри?
При том что они нужны только для другого метода? Или придется либо в один метод всё поместить или создавать переменные и присваивать...

ООП в VBA: Можно ли использовать методы класса внутри его самого
Интересует: является ли это хорошим стилем программирования, или это приведет к проблемам? Извините, пожалуйста, если плохо...

11
Заблокирован
01.10.2015, 18:43
Цитата Сообщение от auditseo Посмотреть сообщение
как правильно делать
вот так:
Цитата Сообщение от auditseo Посмотреть сообщение
функции function makeSomething($lenght) вынести в отдельный приватный метод
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
02.10.2015, 00:08
auditseo, Оба примера отличаются только тем, что в первом метод makeSomething открытый (public по умолчанию), а во втором закрытый. А как правильно зависит от того, должен ли метод быть виден пользователю, либо он только для внутреннего пользования, должны ли видеть его потомки (protected)
1
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
02.10.2015, 22:03
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Оба примера отличаются только тем, что в первом метод makeSomething открытый (public по умолчанию), а во втором закрытый. А как правильно зависит от того, должен ли метод быть виден пользователю, либо он только для внутреннего пользования, должны ли видеть его потомки (protected)
Эм... В первом случае makeSomething() это вообще не метод (тем более не публичный). Это простая функция, область видимости которой - метод MyClass::calcSize().

Цитата Сообщение от auditseo Посмотреть сообщение
Функции внутре методов понравилось делать после JS, там весьма удобно удобно все реализовывется. Прошу просвятить меня, как правильно делать.
функция в функции как то стремно выглядит...
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
02.10.2015, 22:05
Цитата Сообщение от pav1uxa Посмотреть сообщение
В первом случае makeSomething() это вообще не метод
точно. не заметил что она внутри метода.
auditseo, иззвиняюсь за дезинформацию
0
63 / 63 / 2
Регистрация: 10.03.2014
Сообщений: 73
02.10.2015, 23:22  [ТС]
Цитата Сообщение от pav1uxa Посмотреть сообщение
функция в функции как то стремно выглядит...
вомзможно, пересмотрю концепцию написания кода, спасибо за замечание и ответы.
Цитата Сообщение от pav1uxa Посмотреть сообщение
Эм... В первом случае makeSomething() это вообще не метод (тем более не публичный). Это простая функция, область видимости которой - метод MyClass::calcSize().
Этот пример говорит, что область видимости внутренней функции больше (test3() видна и в test4()):

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Test{
    function test1(){
              test3();
        }
 
        function test2(){
                function test3(){
                        echo " Inner function<br> ";
                }
                test3();
        }
        function test4(){
                test3();
        }
}
 
$test = new Test;
//$test->test1(); // Генерирует ошибку вида PHP Fatal error:  Call to undefined function test3()
$test->test2();
$test->test4();
test3();
Что только подтверждает, что так писать нехорошо.
1
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
03.10.2015, 11:51
Цитата Сообщение от auditseo Посмотреть сообщение
Этот пример говорит, что область видимости внутренней функции больше (test3() видна и в test4()):
Ужас какой-то... Даже не представляю почему так происходит и зачем это вообще надо, если честно...

Возможно разработчики PHP даже вообразить себе не могли что кто-нибудь когда-нибудь догадается такое написать и поэтому не обратили внимания?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
03.10.2015, 13:47
Цитата Сообщение от pav1uxa Посмотреть сообщение
Даже не представляю почему так происходит и зачем это вообще надо, если честно...
Для случаев, когда include/require происходит внутри функции. Например
PHP
1
2
3
4
5
6
7
8
<?php // index.php
function do_include() {
    include 'test.php';
}
 
//foo(); - ошибка
do_include();
foo();
PHP
1
2
3
4
<?php // test.php
function foo() {
    echo 'function foo';
}
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
03.10.2015, 15:09
Jewbacabra
Интересно, что хотя функция test3 определена внутри блока test2, имя test3 становится глобальным.
Что же будет, если в глобальном пространстве имён определить другую функцию test3?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
03.10.2015, 16:05
Цитата Сообщение от mporro Посмотреть сообщение
Что же будет, если в глобальном пространстве имён определить другую функцию test3?
будет ошибка выполнения
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function foo() {
    function test() {
        echo 'foo test';
    }
}
 
function bar() {
    function test() {
        echo 'bar test';
    }
}
 
foo();
test();
//bar(); - тут упадет
Здесь описано такое поведение.
Когда файл включается, его код наследует ту же область видимости переменных, что и строка, на которой произошло включение. Все переменные, доступные на этой строке во включающем файле будут также доступны во включаемом файле. Однако все функции и классы, объявленные во включаемом файле, будут доступны в глобальной области видимости.
0
63 / 63 / 2
Регистрация: 10.03.2014
Сообщений: 73
03.10.2015, 16:25  [ТС]
Цитата Сообщение от mporro Посмотреть сообщение
Интересно, что хотя функция test3 определена внутри блока test2, имя test3 становится глобальным.
Что же будет, если в глобальном пространстве имён определить другую функцию test3?
Хрень происходит: Fatal error: Function already defined: test3 in /in/Hv0eA on line 15

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
function test3(){
    echo "Global test";
}
class Test{
   
    function test1(){
              test3();
        }
        function test2(){
                function test3(){
                        echo " Inner function\n ";
                }
                test3();
        }
        function test4(){
                test3();
        }
}
 
$test = new Test;
//$test->test1(); 
$test->test2();
$test->test4();
test3();
https://3v4l.org/Hv0eA

Добавлено через 14 минут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class Test{
   
    public function test1(){
        echo "IN test1()\n";
              $this->test2();
        }
        private function test2(){
                function test3(){
                        echo " Inner function\n ";
                }
                echo "IN test2()\n";
                test3();
        }
    public function test4(){
            echo "IN test4()\n";
                test3();
        }
}
 
$test = new Test;
$test->test1(); 
$test->test4();
test3();
private так же не помогает, получается все функции выносить в отдельные приватные методы?
0
 Аватар для metacoder
35 / 35 / 15
Регистрация: 28.07.2011
Сообщений: 64
06.10.2015, 20:08
http://php.net/manual/ru/funct... efined.php

Все функции и классы PHP имеют глобальную область видимости - они могут быть вызваны вне функции, даже если были определены внутри и наоборот.
Вложенные функции создаются в глобальном пространстве имён когда вызываются внешние, в которых они определены. Т.е. до вызова метода test2 (через test1) функция test3 не существует.

А вы, видимо, хотели вот это:

PHP
1
2
3
4
5
6
function f ($ololo) {
    $g = function ($blabla) {
        echo $blabla;
    };
    $g($ololo);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2015, 20:08
Помогаю со студенческими работами здесь

Дан абстрактный класс «Геометрическая фигура», внутри него определить абстрактные и (или) виртуальные методы
Дан абстрактный класс «Геометрическая фигура», внутри него определить абстрактные и (или) виртуальные методы. Производным классом...

Дан абстрактный класс «Геометрическая фигура», внутри него определить абстрактные и (или) виртуальные методы
Здравствуйте, помогите пожалуйста с данной задачей: Дан абстрактный класс «Геометрическая фигура», внутри него определить абстрактные и...

Какие компоненты, классы, методы использовать для построения 2D графика функции?
Здравствуйте, подскажите пожалуйста какие компоненты, классы, методы использовать для построения 2D графика функции? И посоветуйте хорошие...

Как внутри класса с QMainWindow использовать функции из QWidget?
Как внутри класса с QMainWindow использовать функции из QWidget class Main(QMainWindow): def __init__(self): ...

Можно ли внутри самого регулярного выражения использовать функции
Здравствуйте! Я бы хотела спросить, можно ли внутри самого регулярного выражения использовать функции заданные раньше? Например, функцию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru