[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ООП в php: вложенные классы, добавление методов, п
test
Вопрос №1:
Существуют ли в php подклассы, имена которых видны только из основного класса, что-то вроде:

PHP
class ParentClass
{
    private function 
Func1 () {}
    public function 
Func2 () {}
    
    class 
ChildClass
    
{
        private function 
Func3 () {}
        public function 
Func4 () {}
    }
}


Вопрос №2:
Существует ли в php возможность добавлять методы к имеющимся классам?

Вопрос №3:
Существует ли в php возможность использовать внутри класса операторы include и require, надеясь при этом, что содержимое подключаемых модулей будет интерпретировано именно как часть данного класса, а не как новые функции и/или классы глобальной видимости.


Собственно, все три вопроса сводятся к одному: можно ли каким-то образом собрать класс из нескольких файлов?
К сожалению, у меня пока ответ отрицательный.

Версия php 5.2.4.



Спустя 15 минут, 51 секунда (1.10.2009 - 00:58) sergeiss написал(а):
Цитата (test @ 1.10.2009 - 01:42)
можно ли каким-то образом собрать класс из нескольких файлов?

А ты можешь объяснить, откуда такая потребность? Почему нельзя просто объявить класс со всеми нужными функциями?

Спустя 5 минут, 5 секунд (1.10.2009 - 01:03) test написал(а):
Класс большой. Некий программный подключаемый независимый модуль. Логически он делится на части, каждую из которых лучше оформить, как отдельный "подкласс" и поместить в файл.

Спустя 7 часов, 14 минут, 1 секунда (1.10.2009 - 08:17) Dezigo написал(а):
лучше в нутри класса ParentClass - вызови другой экземпляр класса ChildClass

Спустя 1 час, 31 минута, 14 секунд (1.10.2009 - 09:48) Mozzi написал(а):
test, а использовать наследование? Зачем именно подклассы?

Спустя 13 минут, 8 секунд (1.10.2009 - 10:02) glock18 написал(а):
PHP
class ParentClass
{
    private function 
Func1 () {}
    public function 
Func2 () {}
    
    class 
ChildClass
    
{
        private function 
Func3 () {}
        public function 
Func4 () {}
    }
}

подобный кошмар видел однажды, когда здесь кто-то спросил как создать функцию внутри другой функции...

Цитата
Существуют ли в php подклассы, имена которых видны только из основного класса, что-то вроде:

Имена скрыть нельзя, но можно разрешить создавать объекты класса только в них.
Для этого делается инкапсуляция конструктора, а все классы, объекты которых могут создаваться внутри нужного наследуются от него.

Цитата
Вопрос №2:
Существует ли в php возможность добавлять методы к имеющимся классам?

читай магические методы php5. конкретно, __call

Цитата
Вопрос №3:
Существует ли в php возможность использовать внутри класса операторы include и require, надеясь при этом, что содержимое подключаемых модулей будет интерпретировано именно как часть данного класса, а не как новые функции и/или классы глобальной видимости.

можно для начала попробовать, а потом уже спрашивать.

Цитата
Собственно, все три вопроса сводятся к одному: можно ли каким-то образом собрать класс из нескольких файлов?
К сожалению, у меня пока ответ отрицательный.


именно в такой формулировке - невозможно

Спустя 4 часа, 13 минут, 49 секунд (1.10.2009 - 14:15) Guest написал(а):
Цитата
Имена скрыть нельзя, но можно разрешить создавать объекты класса только в них.
Для этого делается инкапсуляция конструктора, а все классы, объекты которых могут создаваться внутри нужного наследуются от него.

Подробнее и с примером.

Цитата
можно для начала попробовать, а потом уже спрашивать.


вот тебе пример, можешь пробовать, а потом уже и отвечать:

test1.php
PHP
class test1
{
    function 
go()
    {
        include 
'test2.php';
    }
}
test1:go();


test2.php
PHP
class test2
{
}


Подсказка: получится два класса глобальной видимости.

Спустя 30 минут, 55 секунд (1.10.2009 - 14:46) glock18 написал(а):
Цитата
вот тебе пример, можешь пробовать, а потом уже и отвечать:

у меня нет слов, молодой человек.

Цитата
Подсказка: получится два класса глобальной видимости.

спасибо за подсказку. но попробовать я предлагал вам, потому что меня не донимают такие совершенно бесмысленные безграмотные вопросы, как - создать классы внутри классов.

а касательно

Цитата
Существует ли в php возможность использовать внутри класса операторы include и require, надеясь при этом, что содержимое подключаемых модулей будет интерпретировано именно как часть данного класса


выполни это
file1.php
PHP
class MyClass
{
  protected $member = null;
  public function useInclude($file)
  {
    include($file);
  }

  public function getMember()
  {
    return $this->member;
  }
}

$myObj = new MyClass;
$myObj->useInclude('file2.php');
echo $myObj->getMember();


file2.php
PHP
$this->member = 'I am lazy webdev, so I could not check it out myself.';


и учи ООП прежде, чем выдвигать такие предположения.

Спустя 3 минуты, 16 секунд (1.10.2009 - 14:50) glock18 написал(а):
В действительности, поражает такое отношение. Человек пришел за ответами на вопросы, так хотя бы придерживайся банальной вежливости, а не тычь другим и не переводи стрелки.

Спустя 20 минут, 28 секунд (1.10.2009 - 15:10) Guest написал(а):
Цитата
file1.php
PHP
бла-бла-


file2.php
PHP
бла-бла-


Не то, молодой человек. Читай внимательно первое сообщение.

Цитата
магические методы php5. конкретно, __call

Требуется добавление новых методов, а не реакция на вызов несуществующих - опять промах.

Спустя 42 минуты, 42 секунды (1.10.2009 - 15:53) glock18 написал(а):
Более чем уверен, что поставленная перед тобой задача решается без подобных вещей. Создание класса из нескольких файлов совершенно ненужное дело, мало того не укладывающееся в ооп. В любом случае, если такое понадобилось, то конечная цель может быть достигнута другим более подходящим способом.

Спустя 47 минут, 25 секунд (1.10.2009 - 16:40) Guest написал(а):
Я этот способ и пытаюсь найти, попробую изложить понятнее:

Есть некая задача, состоящая из нескольких частей.
Каждая часть должна получать данные на входе и выдавать какие-то данные на выходе. Каждая часть большая по объему, поэтому хочется ее поместить в отдельный файл.
Пользователь подключает всю эту программу, например, таким способом:


PHP
<?
require_once 
'project.php';
Project::go($parametrs);


Где Project – это класс, а go – функция, выполняющая роль конструктора, которая запускает всю задачу с определенными входящими параметрами $parametrs. Файл project.php содержит класс Project и подключает все другие нужные файлы.

Больше никаких глобальных переменных и имен, кроме Project, нет. То есть если вызвать

PHP
<?
print_r(get_declared_classes());


Получим список стандартных классов php + класс “Project”.
Это делается для того, чтобы программа была как можно более автономна и пользователь мог использовать любые названия для классов, кроме Project.


Вставка include отдельных участков кода не подходит – не хочется отделять тело функции от заголовка (если при помощи include вставлять файл с целой функцией, то она воспринимается, как глобальная)

Пока есть только два решения:
1) Поместить всю большую программу в один файл
2) Разбить не несколько классов

Спустя 18 минут, 27 секунд (1.10.2009 - 16:59) Mozzi написал(а):
"Это делается для того, чтобы программа была как можно более автономна и пользователь мог использовать любые названия для классов, кроме Project."

blink.gif

То есть этот весь сыр бор для того что бы не засорять глобальное пространство имён?

Спустя 3 минуты, 44 секунды (1.10.2009 - 17:02) glock18 написал(а):
Цитата
Пока есть только два решения:
1) Поместить всю большую программу в один файл
2) Разбить не несколько классов


только так. еще повторюсь, что объявлять классы внутри классов или функции внутри функций абсолютно бессмысленное занятие. такого нет и не будет. насколько я знаю, ни в одном ооп языке.

другое дело, что таким образом пытаешься решить существующую задачу. могу сказать, что лучше всего делить это все добро на зависимые классы и работать с ними. процесс сборки класса так же может напомнить наследование. когда тебе нужно какие-то определенные функции, а другие не нужны, то это делается к примеру так:

PHP
class Project
{
  
/**
    здесь какой-то минимальный набор функций
  */
  
public static function go($params)
  {
    
// определяем по параметрам какой класс надо подключить
  
}
}

class 
Project1 extends Project
{
  
/**
  методы нужные в одном случае
  */
  
public function method1() 
  {}
}

class 
Project2 extends Project
{
  
/**
  методы нужные в одном случае
  */
  
public function method2() 
  {}
}

внутри go по параметрам просто определяешь, какой класс надо подключить, и работаешь с ним. никаких лишних функций не будет, и если угодно - это можно с определенной натяжкой назвать "собрать класс в нескольких файлах".

Спустя 8 минут, 22 секунды (1.10.2009 - 17:11) Sylex написал(а):
Цитата (test @ 1.10.2009 - 03:42)
Вопрос №1:
Существуют ли в php подклассы, имена которых видны только из основного класса, что-то вроде:


...

Цитата (test @ 1.10.2009 - 03:42)
Вопрос №2:
Существует ли в php возможность добавлять методы к имеющимся классам?


вопрос некорректен.. но попробую ответить:

все гораздо проще чем вы думаете, необходимо просто объявить функцию в классе - function name(...

Цитата (test @ 1.10.2009 - 03:42)
Вопрос №3:
Существует ли в php возможность использовать внутри класса операторы include и require, надеясь при этом, что содержимое подключаемых модулей будет интерпретировано именно как часть данного класса, а не как новые функции и/или классы глобальной видимости.
Цитата
All functions and classes in PHP have the global scope - they can be called outside a function even if they were defined inside and vice versa.



Спустя 14 минут, 51 секунда (1.10.2009 - 17:25) Sylex написал(а):
Изучайте шаблоны проектирования, они предоставляют универсальные пути решения общих проблем программирования smile.gif

в вашем случае:

http://www.inphp.org/doc/phpmanual/languag...5.patterns.html

Спустя 17 часов, 37 минут, 36 секунд (2.10.2009 - 11:03) Guest написал(а):
Подвожу итог: в языке нельзя реализовать программный модуль из нескольких файлов, который занимает в глобальной области видимости единственное имя, или же никто из присутствующих не знает, как это реализовать. Скорее всего первое smile.gif. Добавим минус в пользу php.

Тема закрыта.

Спустя 6 минут (2.10.2009 - 11:09) glock18 написал(а):
Guest
Может будет интересно: почитай про пространства имен. Поддержка только с php 5.3
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.