как на PHP реализовать описание типа такое как в Delphi например?

smile.1980

Новичок
как на PHP реализовать описание типа такое как в Delphi например?

это в дельфи:

type
TMWCResType = (rtError, rtFolder, rtTables, rtTable, rtTicker);
TMWCResTypes = set of TMWCResType;
TMWCResFlag = (rfDefault, rfTreeView, rfMenuView);
TMWCResFlags = set of TMWCResFlag;

type
TMWCResource = record
ID: Integer;
ParentID: Integer;
Title: PChar;
ResType: TMWCResType;
SubType: Integer;
BaseURL: PChar;
Flags: TMWCResFlags;
end;


в php получается нечто, конечно частично неверно, но чего только не пробовал:
PHP:
class TMWCResFlag{

	var $rfDefault;
	var $rfTreeView;
	var $rfMenuView;
	
	function __construct(){}
}

class TMWCResFlags extends TMWCResFlag{
	function __construct(){}
}

class TMWCResType{

	var $rtError;
	var $rtFolder;
	var $rtTables;	
	var $rtTable;	
	var $rtTicker;	

	function __construct(){}
}

class TMWCResource{
	var $ID;
	var $ParentID;
	var $Title;	
	var $ResType;	
	var $SubType;	
	var $BaseURL;	
	var $Flags;	
	
	function __construct(){
		$this->ResType = new TMWCResType();
		$this->Flags = new TMWCResFlags();
	}
}

- не понимаю как объявить тип TMWCResFlags = set of TMWCResFlag; Это я так понимаю список типов.
застопорился и прям не знаю как сделать ((. Нужно для того чтобы передать объект в фукнцию dllки. С обычными типами одиночными всё хорошо проходит.
 

maxwell

artifex
set это множество если не ошибаюсь, а в пхп «таких-же» множеств нету.
 

Alexandre

PHPПенсионер
а в пхп «таких-же» множеств нету
есть массивы объектов, но это автору не поможет...
Нужно для того чтобы передать объект в фукнцию dllки
очевидно ни как... в пхп нельзя сделать структуру типа - record {...} и классы в пхп, не являются классами (объектами), как таковыми, какими их привыкли видеть в ООП.
а, вообще, как ты эту cамую dll-ку собираешься вызывать??
боюсь, тебе придется писать враппер для вызова.
 

smile.1980

Новичок
Автор оригинала: Alexandre
есть массивы объектов, но это автору не поможет...очевидно ни как... в пхп нельзя сделать структуру типа - record {...} и классы в пхп, не являются классами (объектами), как таковыми, какими их привыкли видеть в ООП.
а, вообще, как ты эту cамую dll-ку собираешься вызывать??
боюсь, тебе придется писать враппер для вызова.
(( Очень жаль, прям расстроил меня php :) .
А dllку подгружаю с помощью уже написанного враппера DynamicWrapper. $com = new COM("DynamicWrapper"); $com->Register("mwc2.dll", "MWCGetResourceData", "i=uk", "f=s", "r=u"); и т.д. ))
 

Alexandre

PHPПенсионер
А dllку подгружаю с помощью уже написанного враппера DynamicWrapper. $com = new COM("DynamicWrapper");
ага... у тебя СОМ объект - так бы и говорил :)
а переписать свой сом можно??
 

smile.1980

Новичок
Автор оригинала: Alexandre
ага... у тебя СОМ объект - так бы и говорил :)
а переписать свой сом можно??
нет у меня то как раз не COM объект, COM объект это сам враппер.... если бы был COM то наверно и проблем было меньше )

-~{}~ 10.07.08 10:50:

Вот пример попроще ))
function MWCFindResource(
URL: PChar;
ResType: TMWCResType;
var ID: Integer
): Integer; stdcall;
TMWCResType = (rtError, rtFolder, rtTables, rtTable, rtTicker);

т.к. TMWCResType это "Enumerated Type Code", то соответственно rtError=0, rtFolder=1 и т.д., т.е. сам ти данных будет целочисленным

и должно работать типа
$fRes = 2;
$resID = 0
$result = $com->MWCFindResource("url",$fRes,$resID);

в Visual Basic такое канает, в PHP опять же вылетает ((
 

Krishna

Продался Java
очевидно ни как... в пхп нельзя сделать структуру типа - record {...} и классы в пхп, не являются классами (объектами), как таковыми, какими их привыкли видеть в ООП.
Ты бредишь? Что ты курил?
Все функции record выполнит обычный массив PHP, за исключением ограничений по типам и числу полей.

Про классы в пхп это вообще был какой-то перл необъяснимый!
 

Alexandre

PHPПенсионер
Ты бредишь? Что ты курил?
Все функции record выполнит обычный массив PHP, за исключением ограничений по типам и числу полей.
это ты что курил, и кто из нас бредит еще вопрос.
все массивы а РНР реализованы как хеш-функции, по этому нельзя их использовать в качестве передачи параметров для внешних структур, типа рекорд. Внутри пхп можно, не спорю...

Про классы в пхп это вообще был какой-то перл необъяснимый!
запиши этот перл в цитатник...
кстати классы в пхп тоже реализованы как набор функций, доступ к которым осуществляется через хешмассив
внешне РНР похож на ООП, но как таковым он им не является,
по классификации Буча - это Объектный язык (поддерживается наследственность и инкапсуляция), но не Объектно-Ориентированный
так как нет основного признака ООП как типизация
 

Krishna

Продался Java
Alexandre
Это:
в пхп нельзя сделать структуру типа - record {...}
- и
все массивы а РНР реализованы как хеш-функции, по этому нельзя их использовать в качестве передачи параметров для внешних структур, типа рекорд.
- разные утверждения - раз.
Хеш-массивы и хеш-функции - разные вещи - два.

внешне РНР похож на ООП, но как таковым он им не является,
так как нет такого признака как типизация
Два балла по ООП :)

1) Строгая типизация не является необходимым признаком для ООП-языка
2) PHP - полноценный ООП язык, а не "похож".
3)
кстати классы в пхп тоже реализованы как набор функций, доступ к которым осуществляется через хешмассив
Как они реализованы, если ты конечно говоришь про код самого интерпретатора нас вообще волновать не должно, ибо главное как они себя ведут.

-~{}~ 10.07.08 15:43:

по классификации Буча - это Объектный язык (поддерживается наследственность и инкапсуляция), но не Объектно-Ориентированный
так как нет основного признака ООП как типизация
Основы ООП парадигмы это инкапсуляция, наследование и полиморфизм, а не типизация.

К тому же, в пхп есть типизация, просто она динамическая, неявная и скрыта неявным приведением типов.

-~{}~ 10.07.08 15:44:

+ на уровне объектов типизация в пхп поддерживается, мы можем задавть класс операнда для метода.
 

Alexandre

PHPПенсионер
Это и это разные утверждения - раз.
чем же???
Хеш-массивы и хеш-функции - разные вещи - два.
да, согласен...
2) PHP - полноценный ООП язык, а не "похож".
это тема 100% оффтопа, уже много раз обсасывалась... сколько людей - столько и мнений...Я привел - классификацию Буча. Приведи другую классификацию языков программирования
на уровне объектов типизация в пхп поддерживается, мы можем задавть класс операнда для метода
мы не можем выбирать на уровне реализации языка необходимый метод реализации, в зависимости от переданного типа, т.е для объекта, типа News выполнить первый определенный метод run (<news>) , а для объекта типа person выполнить второй определенный метод run( <person>). может я непонятно объяснил?
PHP:
class foo {
 public  function bar (  $x as news  ){...}
 public function bar (  $x as person  ){...}
 }
 $foo = new foo();
 $foo->bar(  new News ) // вызываем первую реализацию 
 $foo->bar(  new Person ) // вызываем вторую реализацию
 

kode

never knows best
class foo {
private bar ( $x as news ){...}
private bar ( $x as person ){...}
}

PHP не ява, но можно извернутся
interface Cell {}
class CellOne implements Cell{}
class CellTwo implements Cell{}

class Tester {
public function testOne(CellOne $x){
echo "Test passed";
}

public function testTwo(CellTwo $x){
echo "Test passed";
}

public function test(Cell $x){
if($x instanceof CellOne){
$this->testOne($x);
}elseif ($x instanceof CellTwo ){
$this->testTwo($x);
}
}
}

$test = new Tester();
$test->test(new CellTwo());

PHP не ОО язык
 

Alexandre

PHPПенсионер
Повторюсь:
в пхп нельзя сделать структуру типа - record {...}
ее можно сэмулировать используя объект или массив. Структура, типа
type
TMWCResource = record
ID: Integer;
ParentID: Integer;
Title: PChar;
ResType: TMWCResType;
SubType: Integer;
BaseURL: PChar;
Flags: TMWCResFlags;
end;
представляет набор данных выделенных в памяти, которые иду в строгом порядке: 4 байта для Int, sizeof(TMWCResType) байт для структуры TMWCResType, 4 байта для Int, байт указатель на PChar и так далее...
в пхп - как ни крути, ты набор доступа к ячейкам пямяти расположенным в таком же порядке внутренними средствами языка не определишь. Хотя
всегда можно написать патч для языка или сделать нечто типа экстеншена php_record ;)
 

kode

never knows best
а по теме топика: pack и изучение строения структур (как это выглядит в памяти) дельфей

-~{}~ 11.07.08 12:52:

те я к чему клоню

у нас есть например

struct MaStructa {
int alpha;
int beta;
}

если ну учитывать выравнивание то это можно записать так

$php = array('alpha'=>100,'beta'=>255);

$struct = pack('II',$php['alpha'],$php['beta']);

но верить мне на слово лучше не стоит ;) , проверьте.
 

Krishna

Продался Java
Alexandre

дурацкий вопрос - смыслом утверждения

сколько людей - столько и мнений...Я привел - классификацию Буча. Приведи другую классификацию языков программирования
Поступи на ВМиК МГУ - тебе там преподадут.

мы не можем выбирать на уровне реализации языка необходимый метод реализации, в зависимости от переданного типа, т.е для объекта, типа News выполнить первый определенный метод run (<news> ) , а для объекта типа person выполнить второй определенный метод run( <person> ). может я непонятно объяснил?
И к тому же не владеешь терминологией, это есть перегрузка методов (хоть в пхп перегрузкой кличут вызовы волшебных методов) и не для всех ООП языков она характерна. Это как с исключениями - они тоже по сути не являются частью ООП, но традиционно присутствуют в большинстве.
 

Alexandre

PHPПенсионер
Поступи на ВМиК МГУ - тебе там преподадут.
не думаю, что профессура там более сильна в ООП чем Буч
что касается поступления... мне моих образований вполне хватает,
а на Олимпиадах в МГУ и Физ-теха я будучи школьником активно принимал участие... даже где-то у родителей какая-то бумажка есть ;)
вполне мог бы и поступить...
и вообще мериться ... не благородное это дело
путь ты больше рубишь в ООП, путь в ВМиК МГУ тебе больше напихали знаний
теперь весь форум знает что ты круче всех....
 

Krishna

Продался Java
Alexandre
Ты хоть понимаешь, что Буч не абсолютный авторитет в определении ООП просто потому, что непосредственного отношения к созданию парадигмы ООП не имеет? Ты прочитал цитату из книжки этого товарища и поднял её на знамёна.

Я не про умный - я про откуда взял.

В общем, я считаю, что сказал достаточно, чтобы нубы не приняли на веру твои ошибочные высказывания :Р
 
Сверху